c# - Oracle ODP.NET 托管驱动程序在 64 位中的运行速度比在 32 位中慢 50-100%

标签 c# oracle performance 32bit-64bit odp.net

我刚刚将一些 NUnit 测试项目从 x86 切换到 AnyCPU,并开始使用 nunit-console.exe 而不是 nunit-console-x86.exe 在 64 位运行时运行它们。令我非常惊讶的是,这导致测试持续时间延长了 50-100%。我可以轻松地在任何测试程序集上重复模拟它,甚至分析测试运行,但我无法弄清楚是什么导致了性能损失,因为在 64 位中似乎一切都执行得更慢。我还尝试在几台不同的机器上运行测试,结果相同。

测试程序集使用 Spring.NET IOC 和 Oracle ODP 托管提供程序(这是将测试从 x86 切换到 AnyCPU 的原因)来执行集成测试。测试运行的唯一区别实际上分别是 32 位与 64 位环境或 nunit 可执行文件(nunit-console-x86.exe 与 nunit-console.exe)。

如此大的测试持续时间差异是否有任何一般原因?或者有人知道我应该检查什么以找出问题的原因吗?


跟进:

问题是由今年 8 月发布的 Oracle ODP.NET 托管驱动程序(版本 121010 或 4.121.1.0)引起的。它显然有 many performance issues其中之一是 64 位性能损失。在 32 位环境下运行以下代码时,我的持续时间约为 0.6 秒,在 64 位环境下运行时,持续时间约为 1.5 秒:

        var sw = Stopwatch.StartNew();
        using (var conn = new OracleConnection(ConnectionString))
        {
            conn.Open();

            for (var i = 0; i < 100; i++)
            {
                using (var cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "select sysdate from dual";
                    var result = Convert.ToDateTime(cmd.ExecuteScalar());
                }
            }
        }

        Console.Out.WriteLine(sw.Elapsed);

现在有什么技巧可以让 Oracle ODP.NET Managed 驱动程序获得可接受的性能,还是它还没有准备好生产,即使 Oracle 声称它是“最终”版本?除了回到 native ODP.NET 提供商之外,我还有其他选择吗?

最佳答案

简单的答案是获取两个案例的 ETW 跟踪并使用 wpa/PerfView 等工具分析它们。

关于c# - Oracle ODP.NET 托管驱动程序在 64 位中的运行速度比在 32 位中慢 50-100%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19495292/

相关文章:

c# - 属性和自动实现

python - Oracle 和 Python - cx_Oracle DLL 加载失败

oracle - 将 oracle 转储导入 PostgreSQL

vb.net - TransactionScope 和错误 : ORA-02049

python - 自 Python3.2 以来,GIL 实现变得更糟了吗?

python - 如何查找 Pandas 中组总数的百分比

c# - "Select All"两个或多个下拉列表的选项

c# - 确保给定类型的单个未完成任务的模式

c# - WiFi信号强度功能出现编译错误

java - 以下代码的复杂性