Visual Studio 2015 上的 log10() 性能比 Visual Studio 2013 for x86 慢很多
Posted
技术标签:
【中文标题】Visual Studio 2015 上的 log10() 性能比 Visual Studio 2013 for x86 慢很多【英文标题】:log10() performance on Visual Studio 2015 a lot slower than Visual Studio 2013 for x86 【发布时间】:2015-10-14 09:43:03 【问题描述】:我们已将 VS2013 C++/MFC 应用程序移植到 VS2015,但在 VS2015 编译器生成的性能和代码方面存在一些相当令人不安的问题。
注意这是针对 x86 的。
log10() 调用速度要慢很多。在使用 CPU 采样分析发布版本时,我们看到这些调用比以前占用了更多时间。从例如VS2013 在同一运行中的 49 个样本到 VS2015 中相同运行的高达 7545 个样本。这意味着该函数从 CPU 负载的 0.6% 变为相关应用程序的 50%。
在 VS2013 profiler 中显示:
Function Name Inclusive Samples Exclusive Samples Inclusive Samples % Exclusive Samples %
__libm_sse2_log10 49 49 0.61 0.61
在 VS2015 profiler 中显示:
Function Name Inclusive Samples Exclusive Samples Inclusive Samples % Exclusive Samples %
___sse2_log102 7,545 7,545 50.43 50.43
为什么要使用不同的函数名?
我们已经简要地查看了为 log10 生成的程序集。在 VS2013 上,这转发到 disp_pentium4.inc
和 log10_pentium4.asm
。在 VS2015 上,这是不同的。看来 VS2015 在 Debug 中又回到了__libm_sse2_log10
。
__sse2_log102
会不会是造成这种性能差异的原因?我们检查了调用这些函数的结果输出是否在预期的浮点差范围内。
我们正在使用目标 v140_xp 进行编译,并具有以下编译选项:
/Yu"stdafx.h" /MP /GS- /GL /analyze- /W4 /wd"4510" /wd"4610" /Zc:wchar_t /Z7 /Gm- /Ox /Ob2 /Zc:inline /fp:fast /D "WINVER=0x0501" /D "WIN32" /D "_WINDOWS" /D "NDEBUG" /D "_CRT_SECURE_NO_WARNINGS" /D "_CRT_SECURE_NO_DEPRECATE" /D "_SCL_SECURE_NO_WARNINGS" /D "_USING_V110_SDK71_" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /GR /arch:SSE2 /Gd /Oy /Oi /MT
查看属性时也会在此处显示:
VS2013 和 VS2015 的所有项目设置都相同。请注意,我们使用的是 SSE2 并将浮点模型设置为快速。
有没有人遇到过同样的问题并且知道如何解决这个问题?
【问题讨论】:
我想到的一件事是微软已经大幅重写了他们的库,参见。 this blog post,包括他们的数学库。重写可能介于您比较的两个版本之间。 一切都指向 VS2015 中的“__sse2_log102”实现是原因,它比旧实现慢得多。如果我们用对 ippsLog10_64f_A53 的调用替换对“log10()”的调用,则会消除这种性能回归。 @PeterSchneider 谢谢,是的,我们知道这一点,因为我们所做的端口在浮点到字符串格式方面存在问题,这也已被完全重写。 我刚刚测试过,我的 VS2015 在发布时使用了___libm_sse2_log10
。我不确定我是否复制了您的确切配置,但我至少复制了您屏幕截图中的所有设置。
如果您可以提供最小的复制并在Microsoft Connect 上打开错误,我们愿意进行调查。 (我试图根据您的问题描述来制作复制品,但不能。)
【参考方案1】:
这是我的评论作为答案。
似乎 VS2015 在发布版本中更改了 log10
的实现,它调用这个新的 __sse2_log102
函数而不是旧的 __libm_sse2_log10
并且这个新实现是造成巨大性能差异的原因。
在这种情况下,我们的解决方法是调用 Intel 性能基元 (IPP) 库中可用的实现。例如。而不是调用:
return log10(v);
改为调用它:
double result;
ippsLog10_64f_A53(&v, &result, 1);
return result;
这导致性能问题消失了,实际上使用旧的 IPP 7.0 版本稍微快了一点。不过,并非所有人都可以使用 IPP 并为其付费,因此我们希望 Microsoft 解决此问题。
下面是出现这个问题的VS2015版本。
【讨论】:
以上是关于Visual Studio 2015 上的 log10() 性能比 Visual Studio 2013 for x86 慢很多的主要内容,如果未能解决你的问题,请参考以下文章
VS2015--在 Visual Studio 中调试时映射调用堆栈上的方法
SQL Server 2016/Visual Studio 2015 上的 SSIS OLEDB.12.0 问题
用于 bower.json 文件的 Visual Studio 2015 RC 上的 Intellisense 无法正常工作。
如何从 Visual Studio 2015 (+U1) ASP.NET Core 发布到 Windows Server 2012R2 上的 IIS?
使用Windows 10上的布局下载Visual Studio Community 2015和更新3时出现VSSecondaryInstaller_box错误