为什么Clang这么快分配std :: complex?

彻底

我已经std::complex<double>使用GCC,Clang和Intel C ++编译器测试了阵列的内存分配性能我发现这些编译器之间存在巨大的性能差异。Clang比其他编译器快几个数量级。

谁能找出原因?非常感谢!测试代码,测试环境和测试结果详细信息如下。

附件

这是性能测试代码:

#include <iostream>
#include <complex>

#include <sys/time.h>
#include <stdlib.h>


double GetWallTime(void) {
  struct timeval time;
  if (gettimeofday(&time, NULL)) { return 0; }
  return (double)time.tv_sec + (double)time.tv_usec * .000001;
}


int main(int argc, char *argv[]) {
  auto size = atol(argv[1]);

  auto time_now = GetWallTime();
  auto double_array = new double [size];
  std::cout << "allocate double[" << size << "]: use "
            << GetWallTime() - time_now   << " sec" << std::endl;
  delete[] double_array;

  time_now = GetWallTime();
  auto c99cplx_array = new double _Complex [size];
  std::cout << "allocate double _Complex[" << size << "]: use "
            << GetWallTime() - time_now  << " sec" << std::endl;
  delete[] c99cplx_array;

  time_now = GetWallTime();
  auto stdcplx_array = new std::complex<double> [size];
  std::cout << "allocate std::complex<double>[" << size << "]: use "
            << GetWallTime() - time_now         << " sec" << std::endl;
  delete[] stdcplx_array;
  return 0;
}

在具有Xeon E5-2680 v2 * 2 CPU和64G DDR3内存的Linux机器上,我使用这三个编译器来编译此代码并运行测试。我得到以下结果:

g++7.5.0与--std=c++11 -O3标志一起使用

allocate double[10000000]: use 5.6982e-05 sec
allocate double _Complex[10000000]: use 1.71661e-05 sec
allocate std::complex<double>[10000000]: use 0.0911679 sec

icpc19.1.0.166与--std=c++11 -O3标志一起使用

allocate double[10000000]: use 7.41482e-05 sec
allocate double _Complex[10000000]: use 1.69277e-05 sec
allocate std::complex<double>[10000000]: use 0.087034 sec

clang++与版本一起使用

> clang++ --version
Intel(R) oneAPI DPC++ Compiler 2021.1-beta03 (2019.10.0.1121)
Target: x86_64-unknown-linux-gnu
Thread model: posix

带有--std=c++11 -O3标志:

allocate double[10000000]: use 4.19617e-05 sec
allocate double _Complex[10000000]: use 9.53674e-07 sec
allocate std::complex<double>[10000000]: use 1.19209e-06 sec
抢劫

因为您的测试是可怕的。Clang简单地完全删除了新内容/删除内容,因为它毫无意义。您正在有效地对此进行概要分析:

#include <complex>
int main() {

    auto ptr = new std::complex<double>[1000];
    delete [] ptr;
    return 0;
}

哪一叮叮正确地减少到:

main:                                   # @main
        xor     eax, eax
        ret

https://godbolt.org/z/4JjXfh

另一方面,gcc分配并释放内存。您不是在测试分配速度,而是在测试无汉堡。不要像这样微基准测试,而是对实际代码使用探查器

如果要对此进行概要分析,请执行以下操作:

volatile auto stdcplx_array = new std::complex<double> [size];

它将为每个编译器提供一个准确的基准(不是您的基准值得一做-它只会减少为new + memset + delete)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么std :: rotate这么快?

来自分类Dev

gsl_complex与std :: complex性能

来自分类Dev

Overloading the standard operator<< for std::complex

来自分类Dev

Python集排序,为什么这么快?

来自分类Dev

为什么jQuery的$ .each这么快?

来自分类Dev

与SQLite相比,为什么Realm这么快?

来自分类Dev

为什么heapq.heapify这么快?

来自分类Dev

为什么Regex的Matches功能这么快?

来自分类Dev

为什么Numpy的克朗这么快?

来自分类Dev

为什么C#OrderBy这么快?

来自分类Dev

为什么`updatedb`程序运行这么快?

来自分类Dev

为什么SSD比原始NAND这么快?

来自分类Dev

为什么流浪汉这么快?

来自分类Dev

为什么std :: vector这么快(或者我的实现太慢了)

来自分类Dev

重载标准运算符<< for std :: complex

来自分类Dev

仅在类型为std :: complex时缩放

来自分类Dev

为什么gcc和clang为std :: find生成了这么多代码?

来自分类Dev

提供`T = std :: complex <Q>`时如何避免嵌入`std :: complex`?

来自分类Dev

为什么重塑这么快?(剧透:写时复制)

来自分类Dev

为什么C#Array.BinarySearch这么快?

来自分类Dev

为什么`if`在语句前检查比在语句后检查这么快?

来自分类Dev

为什么像操作员这么快

来自分类Dev

为什么在C#中我的计算比Python这么快

来自分类Dev

为什么用jQuery元素包装元素这么快

来自分类Dev

为什么Eigens mean()方法比sum()这么快?

来自分类Dev

F#:为什么Array.createZero这么快?

来自分类Dev

为什么“范围为(1000000000000000(1000000000000001))”?Python 3这么快?

来自分类Dev

为什么RSSurfaceView类被弃用这么快?

来自分类Dev

F#:为什么Array.createZero这么快?

Related 相关文章

热门标签

归档