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

Posted

技术标签:

【中文标题】Oracle ODP.NET 托管驱动程序在 64 位中的运行速度比在 32 位中慢 50-100%【英文标题】:Oracle ODP.NET Managed Driver running 50-100% slower in 64bit than in 32bit 【发布时间】:2013-10-29 23:46:37 【问题描述】:

我刚刚将一些 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 托管驱动程序中获得可接受的性能,或者即使 Oracle 声称它是“最终”版本,它还没有准备好生产?除了回到本机 ODP.NET 提供商之外,我还有其他选择吗?

【问题讨论】:

测试和您正在测试的项目是否都配置为 64 位? 所有项目都是AnyCPU。 简单的解释是你正在测试的代码慢得多。你不能问我们为什么它更慢,我们不知道它是什么样子的。你需要问一个profiler @HansPassant 是的 - 你是对的。我希望有人已经在我提到的技术上遇到过类似的情况。我目前正在分析一些特定的测试,看起来 Oracle 托管提供程序是主要原因。将报告任何进展.. Oracle 对“生产就绪”的定义与大多数软件公司不同。 【参考方案1】:

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

【讨论】:

以上是关于Oracle ODP.NET 托管驱动程序在 64 位中的运行速度比在 32 位中慢 50-100%的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core 使用ODP.NET Core连接操作Oracle数据库

ODP.NET Oracle.ManagedDataAcess 随机 ORA-12570 错误

ODP.NET Oracle.ManagedDataAccess 导致 ORA-12537 网络会话结束文件

ODP.NET可以使用实体框架工具支持LDAP吗?

在 oracle sql developer 中加入查询快,在 odp.net 中超慢

ODP.NET 过程编译