C++ VisualStudioStd::复杂性能

C++ VisualStudioStd::复杂性能,c++,C++,我在使用std::complex时遇到性能问题。我正在开发AMD架构,Visual Studio 2013 64位,发布模式 当我使用内置的复数运算符*时,这段代码的运行时间大于92毫秒(我对它进行了简化,但这是一个循环,我对结果进行了平均)。如果我使用我在下面注释掉的代码,它本质上是一个手工编码的复数乘法版本,它将在大约6毫秒内运行。复数是基本的构造块,作为科学计算的开发人员,我每天都在使用它们,所以我认为性能会比这个好得多。一般来说,我不能对矩阵作任何假设。没有特别的对称性,它们也不总是正方

我在使用std::complex时遇到性能问题。我正在开发AMD架构,Visual Studio 2013 64位,发布模式

当我使用内置的复数运算符*时,这段代码的运行时间大于92毫秒(我对它进行了简化,但这是一个循环,我对结果进行了平均)。如果我使用我在下面注释掉的代码,它本质上是一个手工编码的复数乘法版本,它将在大约6毫秒内运行。复数是基本的构造块,作为科学计算的开发人员,我每天都在使用它们,所以我认为性能会比这个好得多。一般来说,我不能对矩阵作任何假设。没有特别的对称性,它们也不总是正方形。有人经历过吗?我不愿意使用我自己的手工编码方法。无论我使用的是人工编码的复数乘法还是库中的复数乘法,我都使用相同的编译选项。也许操作不是内联的

#include <iostream>
#include <complex>

#include <vector>

#include <thread>
#include <Windows.h>
using namespace std;

int main()
{
   const int M = 150;
   const int N = 150;
   const int K = 150;

   vector<complex<float>> v1(M*N);
   vector<complex<float>> v2(N*K);
   vector<complex<float>> v3(M*K);

   for (int k = 0; k < M*N; ++k)
   {
      v1[k] = complex<float>(float(k), float(k));
   }

   for (int k = 0; k < N*K; ++k)
   {
      v2[k] = complex<float>(float(k), float(k));
   }

   LARGE_INTEGER frequency, start_time, end_time;

   QueryPerformanceFrequency(&frequency);
   QueryPerformanceCounter(&start_time);
   for (int i = 0; i < M; ++i)
   {
      for (int k = 0; k < K; ++k)
      {
         complex<float> sum(0.0f, 0.0f);
         for (int j = 0; j < N; ++j)
         {
            int idx1 = i*N + j;
            int idx2 = k*N + j;
            sum += v1[idx1] * v2[idx2];
            //float re = v1[idx1].real() * v2[idx2].real() -
            //   v1[idx1].imag()*v2[idx2].imag();
            //float im = v1[idx1].real()*v2[idx2].imag() +
            //   v1[idx1].imag()*v2[idx2].real();
            //sum.real(sum.real() + re);
            //sum.imag(sum.imag() + im);
         }
         v3[i*K + k] = sum;
      }
   }
   QueryPerformanceCounter(&end_time);
   LARGE_INTEGER elapsed_us;
   elapsed_us.QuadPart = (end_time.QuadPart - start_time.QuadPart) * 1000000 / frequency.QuadPart;
   cout << "Total time in microseconds = " << elapsed_us.QuadPart << endl;
   this_thread::sleep_for(chrono::seconds(5));
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
常数int M=150;
常数int N=150;
常数int K=150;
向量v1(M*N);
向量v2(N*K);
向量v3(M*K);
对于(int k=0;kcoutGCC也有同样的问题,除非您使用-O3-ffast math进行编译。ICC似乎根据(比较复数和浮点之间的基准测试)存在问题


我更喜欢mandelbrot集合演示中的手写浮点算法,不使用std::complex。但对于现实世界中的问题,我没有答案。

哦,我以前见过这个问题,但我现在找不到副本,IIRC它只是VS,在优化它方面很差劲。如果我找到它,我会在这里发布。谢谢。我尝试了基本的搜索,但我可以我找不到任何有用的东西。我非常确信我必须启用一个设置或其他东西。不幸的是,标准委员会不能指定性能。我理解他们为什么不能,这很烦人。我想我会查看他们的头文件,看看我能找到什么。是什么让性能如此糟糕?也许我可以打开一个defect报告?哦,天哪,这不是一个骗局,所以,我看到了类似的东西