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.inclog10_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 慢很多的主要内容,如果未能解决你的问题,请参考以下文章

提升Visual Studio 2015上的库

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错误