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

时间:2013-10-21 13:01:40

标签: 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 vs 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托管驱动程序中获得可接受的性能,或者即使Oracle声称它是“最终”版本,它是否还没有生产就绪?除了回到原生ODP.NET提供商之外,我还有其他选择吗?

1 个答案:

答案 0 :(得分:0)

简单的答案是获取两种情况下的ETW跟踪并使用wpa / PerfView等工具进行分析。