Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C/C++;_C++_C - Fatal编程技术网

C++ 如何在C/C++;

C++ 如何在C/C++;,c++,c,C++,C,这个问题没有考虑CPU缓存。也就是说,让缓存完成它的工作(让cpu缓存提高性能) 我的想法是分配足够大的内存块(以便不是所有的内存都能放入缓存),并将它们视为一种数据类型(如int),并进行添加,以避免编译器完全优化代码以读取内存。问题是数据类型是否影响测量?还是有更普遍的方法 编辑:以前可能有点误导。AIDA64的内存和缓存基准就是一个例子,它能够测量内存读/写速度以及延迟。我想知道它是如何实现的。像这样的微基准在C/C++中并不容易。C++中的某些时间不是语言的特定方面。事实上,对于除此之外

这个问题没有考虑CPU缓存。也就是说,让缓存完成它的工作(让cpu缓存提高性能)

我的想法是分配足够大的内存块(以便不是所有的内存都能放入缓存),并将它们视为一种数据类型(如
int
),并进行添加,以避免编译器完全优化代码以读取内存。问题是数据类型是否影响测量?还是有更普遍的方法


编辑:以前可能有点误导。AIDA64的内存和缓存基准就是一个例子,它能够测量内存读/写速度以及延迟。我想知道它是如何实现的。像这样的微基准在C/C++中并不容易。C++中的某些时间不是语言的特定方面。事实上,对于除此之外的所有用例,速度越快越好,因此鼓励编译器做明智的事情

解决这些问题的诀窍是编写基准测试,编译它,然后查看程序集,看看它是否做得很巧妙。或者,至少,检查以确保它有意义(访问更多内存=更多时间)

编译器正在变得智能化。添加并不总是足够的。我不止一次让VisualStudio意识到我在构造微基准并编译它


目前,我很幸运地将
argc
参数作为种子传递到main中,并使用加密散列(如SHA1或MD-5)填充数据。这往往足以诱使编译器实际编写所有读取。但是请验证您的结果。不能保证新的编译器不会变得更智能。

像这样的微基准在C/C++中并不容易。C++中的某些时间不是语言的特定方面。事实上,对于除此之外的所有用例,速度越快越好,因此鼓励编译器做明智的事情

解决这些问题的诀窍是编写基准测试,编译它,然后查看程序集,看看它是否做得很巧妙。或者,至少,检查以确保它有意义(访问更多内存=更多时间)

编译器正在变得智能化。添加并不总是足够的。我不止一次让VisualStudio意识到我在构造微基准并编译它


目前,我很幸运地将
argc
参数作为种子传递到main中,并使用加密散列(如SHA1或MD-5)填充数据。这往往足以诱使编译器实际编写所有读取。但是请验证您的结果。不能保证新的编译器不会变得更智能。

编译器不会愚蠢到将类型视为不可分割的内存块。你需要一种不同的方法。忽略缓存也没有多大意义。缓存总是存在的。很容易指示编译器不要优化内存访问:使用
volatile
类型。是的,数据类型会影响测量和/或性能。由于处理器的特性,而不是内存性能,加载字节而不是字可能需要更多的时间。没有通用的方法来做这件事。尽管强制编译器实际读取内存很容易,但确保测量内存性能却不容易。例如,您必须确保页面已映射,以免度量页面加载而不是内存读取的性能。这些问题依赖于系统,而且(太)广泛。编译器不会愚蠢到将类型视为不可分割的内存块。你需要一种不同的方法。忽略缓存也没有多大意义。缓存总是存在的。很容易指示编译器不要优化内存访问:使用
volatile
类型。是的,数据类型会影响测量和/或性能。由于处理器的特性,而不是内存性能,加载字节而不是字可能需要更多的时间。没有通用的方法来做这件事。尽管强制编译器实际读取内存很容易,但确保测量内存性能却不容易。例如,您必须确保页面已映射,以免度量页面加载而不是内存读取的性能。这些问题取决于系统,而且(太)广泛。