Tag: 优化

为什么memcmp比for循环检查快得多?

为什么memcmp(a, b, size)比以下快得多: for(i = 0; i < nelements; i++) { if a[i] != b[i] return 0; } return 1; memcmp是CPU指令还是什么? 它必须非常深,因为我在循环中使用memcmp获得了大量的加速。

这个memcpy实现中缺少什么/次优?

我对编写memcpy()作为一种教育练习感兴趣。 我不会写一篇关于我做了什么和没想过的论文,但这里有一些人的实现 : __forceinline //因为通常Size已知,内联后编译器可以优化掉大部分无用代码void* myMemcpy(char* Dst, const char* Src, size_t Size) { void* start = Dst; for ( ; Size >= sizeof(__m256i); Size -= sizeof(__m256i) ) { __m256i ymm = _mm256_loadu_si256(((const __m256i* &)Src)++); _mm256_storeu_si256(((__m256i* &)Dst)++, ymm); } #define CPY_1B *((uint8_t * &)Dst)++ = *((const uint8_t * &)Src)++ #define CPY_2B *((uint16_t* &)Dst)++ = *((const uint16_t* […]

在x86和x64上读取同一页面内的缓冲区末尾是否安全?

如果允许在输入缓冲区末尾读取少量数据,那么在高性能算法中发现的许多方法都可以(并且被简化)。 这里,“少量”通常意味着超过结尾的W – 1个字节,其中W是算法的字节大小(例如,对于处理64位块中的输入的算法,最多7个字节)。 很明显, 写入输入缓冲区的末尾通常是不安全的,因为您可能会破坏缓冲区1之外的数据。 同样清楚的是,将缓冲区的末尾读取到另一页面可能会触发分段错误/访问冲突,因为下一页可能不可读。 但是,在读取对齐值的特殊情况下,页面错误似乎是不可能的,至少在x86上是这样。 在该平台上,页面(以及因此内存保护标志)具有4K粒度(较大的页面,例如2MiB或1GiB,可能,但这些是4K的倍数),因此对齐的读取将仅访问与有效页面相同的页面中的字节缓冲区的一部分。 这是一个循环的规范示例,它对齐其输入并在缓冲区末尾读取最多7个字节: int processBytes(uint8_t *input, size_t size) { uint64_t *input64 = (uint64_t *)input, end64 = (uint64_t *)(input + size); int res; if (size = 0) { return input + res; } // align pointer to the next 8-byte boundary input64 = (ptrdiff_t)(input64 + 1) & ~0x7; for […]

如何在C中最好地编写体素引擎并考虑到性能

我是OpenGl中的一个电枢,因此我只想学习现代OpenGl 4.x的东西。 一旦我完成了基本教程(例如旋转立方体),我决定尝试创建一个基于体素的程序,仅处理立方体。 这个程序的目标是快速,使用有限的CPU功率和内存,并且是动态的,因此地图大小可以改变,只有在数组中它表示块被填充时才会绘制块。 我有一个VBO,其中包含由三角形构成的立方体的顶点和索引。 一开始,如果渲染函数我告诉OpenGl要使用的着色器,然后在完成后绑定VBO我执行此循环 绘制立方体循环: //The letter_max are the dimensions of the matrix created to store the voxel status in // The method I use for getting and setting entries in the map are very efficient so I have not included it in this example for(int z = -(z_max / 2); z < […]

从字符串中获取IPv4地址的最快方法

我有以下代码,比inet_addr快约7倍。 我想知道是否有办法改进这个以使其更快或者如果存在更快的替代方案。 这段代码要求提供一个有效的空终止IPv4地址,没有空格,在我的情况下总是这样,所以我针对这种情况进行了优化。 通常你会有更多的错误检查,但如果有办法使更快或更快的替代存在,我会非常感激。 UINT32 GetIP(const char *p) { UINT32 dwIP=0,dwIP_Part=0; while(true) { if(p[0] == 0) { dwIP = (dwIP << 8) | dwIP_Part; break; } if(p[0]=='.') { dwIP = (dwIP << 8) | dwIP_Part; dwIP_Part = 0; p++; } dwIP_Part = (dwIP_Part*10)+(p[0]-'0'); p++; } return dwIP; }

更快相当于gettimeofday

在尝试构建一个对延迟敏感的应用程序时,需要每秒发送100条消息,每条消息都有时间字段,我们要考虑优化gettimeofday。 首先想到的是基于rdtsc的优化。 有什么想法吗 ? 还有其他指针吗? 返回的时间值所需的精确度以毫秒为单位,但如果该值偶尔与接收器不同步1-2毫秒则不是很大。 试图比62纳秒的gettimeofday做得更好