Tag: 性能

在C中检查全零缓冲区的更快方法?

我正在寻找一种更快的方法来完成这个: int is_empty(char * buf, int size) { int i; for(i = 0; i < size; i++) { if(buf[i] != 0) return 0; } return 1; } 我知道我正在寻找一个微观优化,除非在极端情况下,但我知道存在更快的方法,我很好奇它是什么。

为什么snprintf比ostringstream更快还是它?

我在某处读到snprintf比ostringstream更快。 有没有人有这方面的经验? 如果是,为什么它更快。

除非Haswell指明,否则GCC会很难编制前导零数

GCC支持__builtin_clz(int x) builtin,它计算参数中前导零 (连续最重要的零)的数量。 除了0之外 ,这对于有效地实现lg(unsigned int x)函数非常有用,它取lg(unsigned int x)的基数为2的对数,向下舍入为1 : /** return the base-2 log of x, where x > 0 */ unsigned lg(unsigned x) { return 31U – (unsigned)__builtin_clz(x); } 这是直截了当的方式 – 特别是考虑情况x == 1和clz(x) == 31 – 然后x == 2^0所以lg(x) == 0和31 – 31 == 0我们得到正确的结果。 较高的x值类似地起作用。 假设内置程序有效实现,这比其他纯C解决方案更好。 现在,它发生了, 计数前导零操作本质上是x86中bsr指令的双重。 返回参数中最重要的1位2的索引。 因此,如果有10个前导零,则第一个1位位于参数的第21位。 […]

适用于Windows的硬件性能计数器API

我想使用硬件性能计数器 ,特别是x86 CPU来获取缓存未命中或分支错误预测。 性能计数器在英特尔VTune等高级分析器中大量使用。 请不要在Windows操作系统上混淆性能计数器。 为了在C / C ++程序中使用这些计数器,可以使用PAPI: http : //icl.cs.utk.edu/papi/ 这使您可以轻松使用性能计数器,但仅限Linux。 PAPI曾经支持Windows,但现在不支持。 是否有人最近尝试使用PAPI或其他API在Windows上使用硬件性能计数器?

现代处理器上的内存对齐?

我经常看到如下代码,例如,在内存中表示一个大位图: size_t width = 1280; size_t height = 800; size_t bytesPerPixel = 3; size_t bytewidth = ((width * bytesPerPixel) + 3) & ~3; /* Aligned to 4 bytes */ uint8_t *pixelData = malloc(bytewidth * height); (也就是说,一个位图被分配为一个连续的内存块,其字节bytewidth与一定数量的字节对齐,最常见的是4.) 然后通过以下方式给出图像上的一个点: pixelData + (bytewidth * y) + (bytesPerPixel * x) 这引出了两个问题: 对齐像这样的缓冲区会对现代处理器产生性能影响吗? 我应该担心对齐,还是编译器会处理这个问题? 如果它确实有影响,有人可以指向我找到各种处理器的理想字节对齐的资源吗? 谢谢。

快速弧算法算法?

我有自己的,非常快的cos函数: float sine(float x) { const float B = 4/pi; const float C = -4/(pi*pi); float y = B * x + C * x * abs(x); // const float Q = 0.775; const float P = 0.225; y = P * (y * abs(y) – y) + y; // Q * y + P […]

C / C ++:GOTO比WHILE和FOR更快吗?

我知道,每个人都讨厌GOTO,没有人推荐它。 但那不是重点。 我只想知道,哪个代码最快: goto循环 int i=3; loop: printf(“something”); if(–i) goto loop; while循环 int i=3; while(i–) { printf(“something”); } for循环 for(int i=3; i; i–) { printf(“something”); }

如何处理条件初始化,这是一个好习惯吗?

我试图在几种可能的做法之间做出决定。 比方说,我的函数有许多if()块,它们处理数据,这对它们来说是唯一的。 我应该声明并初始化块内的本地(用于块)数据吗? 这是否具有运行时性能成本(由于堆栈中的运行时分配)? 或者我应该在函数入口处声明和/或初始化所有变量,以便在一个可能更快的操作块中完成? 或者我应该在不同的函数中分隔if()块,即使它们只有几行而且在程序中只使用了一行? 或者我是否正在开发另一种更清洁的选择? 这个问题是否以当前的一般forms回答?

glibc strlen()实现如何工作

来自K&R的strlen()仅需几行。 int strlen(char *s) { char *p = s; while (*p != ‘\0’) p++; return p – s; } 但是glibc版本要长得多。 为简单起见,我删除了所有注释和64位实现,提取的版本strlen()如下所示: size_t strlen(const char *str) { const char *char_ptr; const unsigned long int *longword_ptr; unsigned long int longword, magic_bits, himagic, lomagic; for (char_ptr = str; ((unsigned long int) char_ptr & (sizeof (longword) – 1)) != […]

使用C / Intel程序集,测试128字节内存块是否包含全零的最快方法是什么?

继续我的第一个问题,我正在尝试优化通过VTune分析64位C程序找到的内存热点。 特别是,我想找到一种最快的方法来测试一个128字节的内存块是否包含全零。 您可以假设内存块有任何所需的内存对齐方式; 我使用64字节对齐。 我使用的是配备Intel Ivy Bridge Core i7 3770处理器和32 GB内存的PC以及免费版的Microsoft vs2010 C编译器。 我的第一次尝试是: const char* bytevecM; // 4 GB block of memory, 64-byte aligned size_t* psz; // size_t is 64-bits // … // “m7 & 0xffffff80” selects the 128 byte block to test for all zeros psz = (size_t*)&bytevecM[(unsigned int)m7 & 0xffffff80]; if (psz[0] […]