我刚刚将一些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提供商之外,我还有其他选择吗?
答案 0 :(得分:0)
简单的答案是获取两种情况下的ETW跟踪并使用wpa / PerfView等工具进行分析。