5

我刚刚将一些 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)引起的。它显然有很多性能问题,其中之一是 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 提供程序之外,我还有其他选择吗?

4

1 回答 1

0

简单的答案是获取两者的 ETW 跟踪,并使用 wpa/PerfView 等工具对其进行分析。

于 2014-09-15T01:49:27.307 回答