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 网络会话结束文件