我刚刚将一些 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/