Tag: 性能

指针间接是否比条件更昂贵?

指针间接(获取值)是否比条件更昂贵? 我观察到大多数不错的编译器可以在不同程度上预先计算指针间接 – 可能删除大多数分支指令 – 但我感兴趣的是间接成本是否高于分支点的成本。生成的代码。 我希望如果指针引用的数据在运行时不在缓存中,可能会发生缓存刷新,但我没有任何数据可以支持。 有没有人有关于此事的可靠数据(或合理的意见)? 编辑:几张海报指出,分支成本没有“一般情况”:芯片之间的差异很大。 如果您碰巧知道一个值得注意的情况,即分支比缓存间接更便宜(有或没有分支预测),请提及它。

找到char变量中唯一’1’位的索引的最有效方法(在C中)

这是一个面试问题: 给你一个名为ch的char变量,当你知道它代表一个二进制forms的数字时,它的八位中只有一个将等于’1’。 IE, ch的唯一可能值是: 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80 。 给定变量ch ,我需要编写最有效的代码来获得该’1’位的索引。 例如:如果ch == 0x1 – >结果为0.如果ch == 0x4 – >结果为2。 显而易见的方法是使用switch-case,但我需要更高效的东西。 为了有效实施,您可以在这里进行任何操作吗?

循环中的空间位置

根据我的理解,空间位置与附近未来使用的附近记忆有关。 但是我想知道循环是否多次执行,这是否会导致良好的空间局部性? 提前谢谢,对不起,如果我很难理解的话。

通过非常数除数进行矢量化整数除法的最快方法

基于这个问题的答案/评论,我用gcc 4.9.2(MinGW64)编写了一个性能测试来估计多个整数除法的哪种方式更快,如下: #include // SSE2 static unsigned short x[8] = {0, 55, 2, 62003, 786, 5555, 123, 32111}; // Dividend __attribute__((noinline)) static void test_div_x86(unsigned i){ for(; i; –i) x[0] /= i, x[1] /= i, x[2] /= i, x[3] /= i, x[4] /= i, x[5] /= i, x[6] /= i, x[7] /= i; } __attribute__((noinline)) static […]

控制台应用程序运行速度比GUI应用程序快

我对编程世界相对较新。 我有一些性能问题: 控制台应用程序的运行速度比具有图形用户界面的应用程 像C和Pascal这样的语言比C ++和Delphi这样的面向对象语言更快吗? 我知道语言速度更多地依赖于编译器而不是语言本身,但是程序语言的编译器是否比OO编译器(包括可以生成C代码的C ++编译器)产生更快的代码?

如何在C中使用按位或其他有效代码实现逻辑含义?

我想实现尽可能高效的逻辑操作。 我需要这个真值表: pqp → q TTT TFF FTT FFT 据维基百科称,这被称为“ 逻辑蕴涵 ” 我一直试图弄清楚如何在不使用条件的情况下使用C中的按位运算来实现这一点。 也许有人对此有所了解。 谢谢

在PHP应用程序中使用C进行计算:值得吗?

我有一个PHP应用程序,有时需要大量的计算(我搜索用户记录的操作,并在很长一段时间内进行大量的经济学分析)。 我想提高这些计算的速度,是否值得用C重写这些计算部分? (在这里速度较快的语言中,C是我最了解的语言)。 我已经决定这样做,但当我在寻找“怎么做”时,我发现了这个Stack Overflow问题 。 有人评论说“ 为什么不用PHP或C编写整个网站/页面? ”我知道我需要额外的信息。

通过线程和SIMD并行化矩阵乘法

我正在尝试加速多核架构上的矩阵乘法。 为此,我尝试同时使用线程和SIMD。 但我的结果并不好。 我通过顺序矩阵乘法测试加速: void sequentialMatMul(void* params) { cout << "SequentialMatMul started."; int i, j, k; for (i = 0; i < N; i++) { for (k = 0; k < N; k++) { for (j = 0; j < N; j++) { X[i][j] += A[i][k] * B[k][j]; } } } cout << "\nSequentialMatMul finished."; […]

是否可以检查2组3个中的任何一组是否等于9个比较中的任何一组?

int eq3(int a, int b, int c, int d, int e, int f){ return a == d || a == e || a == f || b == d || b == e || b == f || c == d || c == e || c == f; } 如果3个第一个int中的任何一个等于3个最后一个int中的任何一个,则此函数接收6个int并返回true。 是否有任何类似的方式使其更快?

强制GCC执行memcpy运行时大小检查的循环非开关?

是否有任何可靠的方法强制GCC(或任何编译器)在循环外的memcpy()中memcpy()运行时大小检查(其中该大小不是编译时常量,但在该循环内是常量),专门针对每个循环相关的尺寸范围而不是反复检查其中的尺寸? 这是一个测试案例,从这里报告的性能回归中减少了一个开源库,该库旨在用于大数据集的高效内存分析。 (回归恰好是因为我的一个提交…) 原始代码在Cython中,但我已将其简化为纯C代理,如下所示: void take(double * out, double * in, int stride_out_0, int stride_out_1, int stride_in_0, int stride_in_1, int * indexer, int n, int k) { int i, idx, j, k_local; k_local = k; /* prevent aliasing */ for(i = 0; i < n; ++i) { idx = indexer[i]; for(j = 0; j < […]