Tag: 性能

是否更快地访问静态或动态分配的内存?

在C中有两种分配全局数组的方法: 静态 char data[65536]; 动态 char *data; … data = (char*)malloc(65536); /* or whatever size */ 问题是,哪种方法有更好的表现? 多少钱? 理解它,第一种方法应该更快。 因为使用第二种方法,要访问数组,每次访问时都必须取消引用元素的地址,如下所示: 读取包含指向数组开头的指针的变量data 计算特定元素的偏移量 访问元素 使用第一种方法,编译器将data变量的地址硬编码到代码中,跳过第一步,因此我们有: 从编译时定义的固定地址计算特定元素的偏移量 访问数组的元素 每次内存访问相当于大约40个CPU时钟周期,因此,使用动态分配,特别是对于不频繁读取,与静态分配相比可能会显着降低性能,因为data变量可能会被一些更频繁访问的变量从缓存中清除。 相反,解除引用静态分配的全局变量的成本是0,因为它的地址已经在代码中进行了硬编码。 它是否正确?

C如何正确测量时间?

这是“算法”,但是当我想测量执行时间时,它给我零。 为什么? #define ARRAY_SIZE 10000 … clock_t start, end; start = clock(); for( i = 0; i < ARRAY_SIZE; i++) { non_parallel[i] = vec[i] * vec[i]; } end = clock(); printf( "Number of seconds: %f\n", (end-start)/(double)CLOCKS_PER_SEC ); 那么我该怎么做来衡量时间呢?

读取nsdictionary与nsarray的性能

继续这篇文章: 使用NSMutableDictionary与NSMutableArray>产生的性能损失 我正在尝试进行一些测试,看看性能差距是否对NSArray和NSDictionary以及它们的可变coutnerparts之间的读写非常有用…… 但是,我很难找到“平衡”测试…因为字典有2个(或3个,具体取决于你如何看待这个)对象循环以获取所寻找的值(而不是键),而数组只有一… 有什么建议? – 如果你想了解更多细节:我的意思是通过例子更容易解释; 对于数组:(对于数组中的NSString * str){do smth with the string} 对于字典 (for NSString *str in [dictionary allValues]) { string } 要么 (for NSString *str in [dictionary allKeys]) { [dictionary valueForKey:key] } 要么 (for NSString *str in [dictionary allKeys]) { string } 甚至 NSArray *valuesOrKeys = [dictionary allKeys/allValues]; (for NSString *str in […]

什么限制了这个简单的OpenMP程序的扩展?

我试图了解48核系统上的并行化限制(4xAMD Opteron 6348,2.8 Ghz,每个CPU 12个核心)。 我写了这个微小的OpenMP代码来测试加速,我认为这是最好的情况(任务是令人尴尬的并行): // Compile with: gcc scaling.c -std=c99 -fopenmp -O3 #include #include int main(){ const uint64_t umin=1; const uint64_t umax=10000000000LL; double sum=0.; #pragma omp parallel for reduction(+:sum) for(uint64_t u=umin; u<umax; u++) sum+=1./u/u; printf("%e\n", sum); } 我惊讶地发现缩放是高度非线性的。 使用48个线程运行代码需要大约2.9s,使用36个线程运行3.1s,使用24个线程运行3.7s,使用12个线程运行4.9s,使用1个线程运行代码需要57s。 不幸的是,我不得不说计算机上运行一个进程使用100%的一个核心,因此可能会影响它。 这不是我的过程,所以我无法结束它来测试差异,但不知何故,我怀疑这是在19到20倍的加速和理想的48倍加速之间的区别。 为了确保它不是OpenMP问题,我同时运行了两个程序副本,每个程序有24个线程(一个用umin = 1,umax = 5000000000,另一个用umin = 5000000000,umax = 10000000000)。 在这种情况下,程序的两个副本在2.9s之后完成,因此它与使用单个程序实例运行48个线程完全相同。 用这个简单的程序阻止线性缩放的是什么?

在包装的SSE浮标上翻转标志

我正在寻找在SSE寄存器中打包的所有四个浮点数上翻转符号的最有效方法。 我没有在英特尔架构软件开发手册中找到这样做的固有内容。 以下是我已经尝试过的事情。 对于每个案例,我在代码上循环了100亿次并且显示了挂号时间。 我试图至少匹配4秒,这需要我的非SIMD方法,这只是使用一元减号运算符。 [48秒] _mm_sub_ps( _mm_setzero_ps(), vec ); [32秒] _mm_mul_ps( _mm_set1_ps( -1.0f ), vec ); [9秒] union NegativeMask { int intRep; 漂浮fltRep; } negMask; negMask.intRep = 0x80000000; _mm_xor_ps(_mm_set1_ps(negMask.fltRep),vec); 编译器是带有-O3的gcc 4.2。 CPU是英特尔酷睿2双核处理器。

快速整数到十进制转换

给定(无符号)整数,将它转换为包含十进制表示的字符串的最常用方法是什么? 这种天真的做法是重复除以10,直到你达到零。 我不喜欢这种方法,因为它 使用整数除法,它在某些集成平台上既慢又不可用 要求程序员在之后翻转字符串。 这使所需的内存操作数量翻倍。 我想到了以下方法将整数转换为十进制基数。 这是一个好主意吗? 这是如何在printf这样的printf常见实现中完成的? #include const static uint64_t i64_tab[20] = { 1u, 10u, 100u, 1000u, 10000u, 100000u, /* 10^ 5 */ 1000000u, 10000000u, 100000000u, 1000000000u, 10000000000u, /* 10^10 */ 100000000000u, 1000000000000u, 10000000000000u, 100000000000000u, 1000000000000000u, /* 10^15 */ 10000000000000000u, 100000000000000000u, 1000000000000000000u, 10000000000000000000u /* 10^19 */ }; void uint64_to_string(char *out, uint64_t in) […]

与双打混合时使用int和unsigned int之间的速度差异

我有一个应用程序,内部循环的一部分基本上是: double sum = 0; for (int i = 0; i != N; ++i, ++data, ++x) sum += *data * x; 如果x是unsigned int,那么代码的长度是int的3倍! 这是一个更大的代码库的一部分,但我把它归结为基本要素: #include #include #include #include typedef unsigned char uint8; template double moments(const uint8* data, int N, T wrap) { T pos = 0; double sum = 0.; for (int i = 0; […]

常见体系结构的最快整数类型

stdint.h头文件缺少int_fastest_t和uint_fastest_t以与{,u}int_fastX_t类型对应。 对于整数类型的宽度无关紧要的情况,如何选择允许处理最大位数且性能损失最小的整数类型? 例如,如果使用朴素方法在缓冲区中搜索第一个设置位,则可以考虑这样的循环: // return the bit offset of the first 1 bit size_t find_first_bit_set(void const *const buf) { uint_fastest_t const *p = buf; // use the fastest type for comparison to zero for (; *p == 0; ++p); // inc p while no bits are set // return offset of first bit set return […]

zlib,deflate:要分配多少内存?

我正在使用zlib来压缩文本数据流。 文本数据以块为单位,对于每个块,调用deflate() ,flush设置为Z_NO_FLUSH 。 检索Z_FINISH所有块后,调用deflate()并将flush设置为Z_FINISH 。 当然, deflate()不会在每次调用时产生压缩输出。 它在内部累积数据以实现高压缩率。 那没关系! 每次deflate()产生压缩输出时,该输出都会附加到数据库字段 – 这是一个缓慢的过程。 但是,一旦deflate()产生压缩数据,该数据可能不适合提供的输出缓冲区deflate_out 。 因此需要多次调用deflate() 。 这就是我想要避免的: 有没有办法让deflate_out总是足够大,以便deflate()可以存储所有压缩数据,每次它决定产生输出? 笔记: 未压缩数据的总大小事先是未知的。 如上所述,未压缩数据以块的forms出现,压缩数据也以块的forms附加到数据库字段。 在包含文件zconf.h我发现了以下注释。 那也许是我在找什么? 即(1 << (windowBits+2)) + (1 << (memLevel+9)) deflate()可能产生的压缩数据的最大字节数deflate()以字节为单位deflate() ? /* The memory requirements for deflate are (in bytes): (1 << (windowBits+2)) + (1 << (memLevel+9)) that is: 128K for windowBits=15 + […]

如何检查给定的数字是否能以最快的方式整除15?

处理器中的分区需要很长时间,所以我想问如何以最快的方式检查数字是否可以被其他数字整除,在我的情况下我需要检查数字是否可以被15整除。 此外,我一直在浏览网页,并找到有趣的方法来检查数字是否可以被某些数字整除,但我正在寻找快速选项。 注意:由于分工需要很长时间,我正在寻找没有/和%答案。