Tag: 性能

如何测量x86下纳秒以下的时间?

我搜索并使用了许多方法来测量经过的时间。 为此目的有很多问题。 例如, 这个问题非常好,但是当你需要一个准确的时间记录器时,我找不到一个好的方法。 为此,我想在这里分享我的方法以便在出现问题时予以纠正。 更新和注意:这个问题是基准测试,不到一纳秒。 它与使用clock_gettime(CLOCK_MONOTONIC,&start);完全不同clock_gettime(CLOCK_MONOTONIC,&start); 它记录的时间超过一纳秒。 更新:测量加速的常用方法是重复应该进行基准测试的程序部分。 但是,正如评论中所提到的,当研究人员依赖自动向量化时,它可能会显示出不同的优化。 注意一次重复测量经过的时间是不够准确的。 在某些情况下,我的结果显示该部分必须重复超过1K或1M才能获得最短的时间。 建议:我不熟悉shell编程(只知道一些基本命令……)但是,有可能测量最小的时间而不重复程序内部。 我的当前解决方案为了防止分支,我使用宏#define REP_CODE(X) XX X… XX重复ode部分,其中X是我想要基准的代码部分,如下所示: //numbers #define FMAX1 MAX1*MAX1 #define COEFF 8 int __attribute__(( aligned(32))) input[FMAX1+COEFF]; //= {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17}; int __attribute__(( aligned(32))) output[FMAX1]; int __attribute__(( aligned(32))) coeff[COEFF] = {1,2,3,4,5,6,7,8};//= {1,1,1,1,1,1,1,1};//; //= {1,2,1,2,1,2,1,2,2,1}; int main() { REP_CODE( t1_rdtsc=_rdtsc(); //Code for(i = 0; i < […]

类型转换会消耗额外的CPU周期

C / C ++中的类型转换会导致额外的CPU周期吗? 我的理解是,在某些情况下至少应该消耗额外的CPU周期。 就像从float到整数的类型转换一样,CPU应该要求将float结构转换为整数。 float a=2.0; int b= (float)a; 我想了解它会/不会消耗额外CPU周期的情况。

读进程写的最佳缓冲区大小

在我的函数中,我需要将文件中的一些数据读入缓冲区,操作数据并将其写回另一个文件。 该文件大小未知,可能非常大。 如果我使用一个小缓冲区,将会有一个很长的读/写周期,这将花费很多时间。 相反,长缓冲区意味着我需要消耗更多内存。 我应该使用的最佳缓冲区大小是多少? 这种情况是依赖的吗? 我在Windows中看到了一些像Tera copy这样的应用程序,可以高效地管理大量文件。 我应该注意其他任何技术或机制吗? 注意:此程序将在Windows下运行。

为什么我的python / numpy示例比纯C实现更快?

我在python和C.中有几乎相同的代码.Python示例: import numpy nbr_values = 8192 n_iter = 100000 a = numpy.ones(nbr_values).astype(numpy.float32) for i in range(n_iter): a = numpy.sin(a) C示例: #include #include int main(void) { int i, j; int nbr_values = 8192; int n_iter = 100000; double x; for (j = 0; j < nbr_values; j++){ x = 1; for (i=0; i<n_iter; i++) x = […]

循环平铺。 如何选择块大小?

我正在尝试学习循环优化。 我发现循环平铺有助于使数组循环更快。 我尝试使用下面给出的两个代码块,有或没有循环阻塞,并测量两者的时间。 我大部分时间都没有发现明显的差异。 我测试了不同的块大小,但我不知道如何选择块大小。 如果我的方向错了,请帮助我。 实际上我发现没有块的循环工作速度快了很多倍。 一个。 随着阻止 int max = 1000000; int B = 100; for (i = 0; i < max; i += B) { for (j = i; j < (i + B); j++) { array[j] = 0; } } 湾 没有阻止 for (i = 0; i < max; i++) { […]

Lua是否优化了“..”运算符?

我必须执行以下代码: local filename = dir .. “/” .. base 循环中数千次(这是一个打印目录树的递归)。 现在,我想知道Lua是否一次性连接3个字符串(dir,“/”,base)(即,通过分配足够长的字符串来保存它们的总长度),或者它是否通过内部执行它来实现这种效率低下的方式两步: local filename = (dir .. “/”) — step1 .. base — step2 最后一种方式是内存方式效率低下,因为分配了两个字符串而不是一个字符串。 我不太关心CPU周期:我主要关心内存消耗。 最后,让我概括一下这个问题: Lua在执行以下代码时是否只分配一个字符串或4? local result = str1 .. str2 .. str3 .. str4 .. str5 顺便说一句,我知道我能做到: local filename = string.format(“%s/%s”, dir, base) 但我还没有对它进行基准测试(内存和CPU方面)。 (顺便说一句,我知道table:concat()。这会增加创建表的开销,所以我猜它在所有用例中都不会有用。) 奖金问题: 如果Lua没有优化“..”运算符,那么定义用于连接字符串的C函数是一个好主意,例如utils.concat(dir, “/”, base, “.”, extension) ?

找到一对数字,其差别是未排序数组中的输入值’k’

正如标题中所提到的,我想找到差异为K的元素对 example k=4 and a[]={7 ,6 23,19,10,11,9,3,15} output should be : 7,11 7,3 6,10 19,23 15,19 15,11 我已经读过SO中的先前post“ 在数组中找到添加到给定总和的数字对 ” 为了找到有效的解决方案,需要多长时间? 时间复杂度是O(nlogn)还是O(n) ? 我试图通过分而治之的技术来做到这一点,但我没有得到退出条件的任何线索…… 如果一个有效的解决方案包括使用两个指针对输入数组进行排序和操作元素,那么我认为我应该采用最小的O(nlogn) … 是否存在任何与O(n)相关的数学相关技术。 任何帮助表示赞赏..

在C ++代码中使用纯C库是否会导致性能下降/损失?

我看到了这个链接,但我不是要求使用“extern”的代码性能下降。 我的意思是没有“extern”,在C ++中使用C库时是否存在“上下文切换”? 在C ++应用程序中使用纯C(非类包装)函数时是否有任何问题?

没有“-std = c99”的大规模fprintf速度差异

我写过一部表现不佳的翻译,几周来我一直在挣扎。 在下面简单的bechmark #include int main() { int x; char buf[2048]; FILE *test = fopen(“test.out”, “wb”); setvbuf(test, buf, _IOFBF, sizeof buf); for(x=0;x<1024*1024; x++) fprintf(test, "%04d", x); fclose(test); return 0 } 我们看到以下结果 bash-3.1$ gcc -O2 -static test.c -o test bash-3.1$ time ./test real 0m0.334s user 0m0.015s sys 0m0.016s 正如您所看到的,在添加“-std = c99”标志的那一刻,性能崩溃了: bash-3.1$ gcc -O2 -static -std=c99 test.c […]

哪个具有1亿条记录的嵌入式数据库具有高效的C或C ++ API

我正在寻找一个跨平台的数据库引擎,它可以处理数以亿计的记录数据库而不会严重降低查询性能。 它需要有一个C或C ++ API,可以轻松,快速地构建记录并解析返回的数据。 非常气馁的产品是必须将数据转换为字符串以及从字符串转换才能将数据转换到数据库中。 存储IP地址之类的技术用户不需要或不需要这些开销。 这是一个非常重要的标准,因此如果您要参考产品,请明确说明他们如何提供这样的直接API。 不希望变得粗鲁,但我可以使用谷歌 – 请假设我找到了大多数主流产品而且我在问,因为通常很难找到他们提供的直接API,而不仅仅是围绕SQL的C包装器。 它不需要是一个RDBMS – 一个简单的面向ISAM记录的方法就足够了。 虽然主要需求是单用户数据库,但扩展到某种共享文件或服务器操作可能会在将来使用。 如果数据库来自小公司,则非常需要访问源代码(开源或通过许可)。 它不能是GPL或LGPL。