Tag: 性能

我该如何在C库中返回二元运算函数的结果?

我正在研究一个C库,其中一部分涉及一些数学类型并操纵它们。 每种类型都有一个工厂构造函数/析构函数,可以动态分配和释放它们。 例如: /* Example type, but illustrates situation very well. */ typdef struct { float x; float y; float z; } Vector3D; /* Constructor */ Vector* Vector3D_new(float x, float y, float z) { Vector3D* vector = (Vector3D*) malloc(sizeof(Vector3D)); /* Initialization code here…*/ return vector; } /* Destructor */ void Vector3D_destroy(Vector3D* vector) { free(vector); } […]

提高CPU密集型PHP脚本的性能

我有一个PHP脚本,需要几个小时(可能是几天)才能执行。 它非常简单但非常耗费CPU,大部分执行时间都花在了(我可以在分析脚本后告诉): $array = explode(‘,’, $a[$i]); 其中$a[$i]是一个非常长的字符串,表示由逗号分隔的30k元素的向量 foreach($array as $key => $value)循环; 对于每个循环,执行一些in_array()以及比较和赋值操作 $a实际上是一个非常大且稀疏的矩阵(30k * 30k),但我无法将其保留在内存中(8GB似乎没有足够的RAM)所以我只保留一个“稀疏表示”(基本上每行都是一个字符串)并且在我需要连续工作时使用explode() 。 我知道用C语言(或其他语言)重写所有内容会提高性能(多少?)但是,在这之前我想知道我是否可以做任何事情来改善PHP的执行时间。 编辑后回答。 我尝试了几个你的建议,这是我的报告: 1)str_getcsv在大多数情况下比爆炸慢 2)SPLFixedArray减少了存储矩阵所需的内存,但是对于30k x 30k的矩阵来说,8GB是不够的,所以我认为它不会有多大帮助; 这里真正的问题是我认为PHP中缺少矩阵的稀疏表示 3)我无法存储爆炸操作的所有结果,因为这仍然意味着将整个矩阵保留在内存中(没有足够的RAM) 4)我已经尝试过数据库方法,即使我确定它会慢一些:我存储了三元组(i,j,value)来表示每个矩阵元素; 甚至删除不太重要的值(我可以牺牲小于阈值的值并获得不太精确的结果,但仍然有用)并且只存储了1800万个元组,使用mysql myisam的方法比我在内存中的数组方法慢得多。 5)我尝试了使用MEMORY引擎(RAM中的mysql表)的数据库方法并存储除零值为零的所有矩阵元素; 这次有4200万条记录……它更快,不是一个数量级,但快2-4倍……我想我可以在5天而不是15-20完成工作……它仍然太多了(我想在24小时内完成),如果您有任何其他建议,欢迎您 编辑2:我解释了这个问题 我会提供一些关于这个问题的细节,我真的需要简化一切,否则解释起来会太长,但我认为这足以让他们更好地了解情况。 我有一个矩阵表示节点之间的距离; 整数中的距离也可以是无限的。 我有一个内存表,用三元组表示每个距离:node_1,node_2,distance(仅表示非无限距离)。 我有这种贪婪的算法,我没有写,我应该优化在具有8GB RAM的笔记本电脑上在可行的时间(比如说不到一天)执行它。 算法基本上进入输入两个节点,并根据必须在每个步骤validation的以下两个属性逐步设计起始节点和结束节点之间的路径: 必须在相对于当前节点更靠近结束节点的节点集中选择新的中间节点 在这些节点中,选择更接近当前节点的节点 请考虑1)不满足三角不等式。 2)这不是最短的路径问题 这是我调用的函数的一些伪代码,直到我足够接近结束节点: get_next_node($node_1, $node_2){ $dist = select distance from distances_table where node_2 = […]

关于读/写速度的堆与堆栈

我刚刚在Stack Overflow(以及通过Google找到的其他随机站点)上经历了一堆堆栈与堆线程,但我找不到能够为读/写速度问题提供更多(如果有的话)深度的答案(大多数答案和文章都关注分配速度)。 如果我正在编写一个C程序(在我的情况下,一个游戏),我将对象数据存储在一个几千字节的缓冲区中,如果分配了该缓冲区,它是否会产生差异(就访问速度而言)在堆栈上还是在堆上? 或者,在决定存储它的硬件(即缓存或RAM)的位置时,编译器是否会以相同的方式处理该大小的缓冲区?

整数提升会影响64位性能吗?

以下面的代码为例: uint32_t fg; uint32_t bg; uint32_t mask; uint32_t dest; … dest = (fg & mask) | (bg & (~mask)); 现在这个片段的所有操作数都是32位无符号整数。 使用32位int大小的C编译器,不会发生整数提升,因此整个操作以32位执行。 我的问题是,例如在维基百科上 ,显示通常甚至64位机器都有使用32位int大小的编译器。 符合C标准,它们不会将操作数提升到64位整数,因此可能会编译成性能较差甚至更大的代码大小的东西(只是假设16位操作是如何更昂贵的循环和指令大小的32位x86)。 主要问题是:我是否需要担心? (我相信我可能没有,因为通过优化启用一个理智的编译器可能能够省略严格遵循C标准显示的多余的gunk。请参阅示例代码,并考虑一般我的信念可能会少一些地面) 如果是这样(我实际上需要关注),你能推荐一些涵盖这个领域的方法(书籍,网站,等等)吗? (嗯,我知道这对于SO来说有点过时了,但是如果我只得到一个三个字,那么我认为这个有用得多, 是的,你做了!作为接受的答案)

数值大于ULLONG_MAX

我需要存储和使用大于ULLONG_MAX数值。 我将需要使用这些值进行算术运算,因此我认为store as char**不是一个选项。 有没有办法在这些情况下动态创建额外的long前缀? 谢谢你们。 根据回复,非常有帮助,但我怀疑最佳性能选项。 piokuc引用性能链接,但目前还不清楚。 在这段时间我在GMP或MPIR之间,有一个更快?

寻找function复杂性指数

我必须根据行数找到C文件的复杂性。 我找到了行数。 但是如何判断它是否是一个复杂的文件呢? 基于一定的价值,我必须给它一个索引。 例如,复杂性指数 – 高复杂度的5。 我可以在哪个基础上编制索引? 例如,超过1000条高复杂的生产线将不适用于所有生产线。 是否有任何标准的方式给出条件(’超过1000行’)? 除了任何预定义的工具,欢迎任何类型的建议。 我需要用C编程。提前谢谢。

在为ARM7编译的C代码中,使用全局变量是增加还是降低性能?

在为ARM7嵌入式平台编译时,在C代码中使用大量全局变量是否会降低或提高性能? 代码库由多个C源代码文件组成,这些文件使用extern关键字引用彼此的全局变量。 来自不同源代码文件的不同函数指的是不同的全局变量。 一些变量是数组。 我正在使用的编译器是IAR的EW ARM kickstart版本(32kb)。

编写此代码段的有效方法是什么?

是否可以更有效地和/或更快地重写此代码以节省字节并且看起来更简洁? if(N % 2 == 0 && (N == 6 || N == 8 || N == 10 || N == 12 || N == 14 || N== 16 || N == 18 || N == 20 )) { printf(“Weird\n”); } 鉴于语言是C,如果它的java或php或任何其他语言无关紧要:-)。

与单个进程方案相比,多进程方案中的访问时间意外较低

我从program1访问共享库(共享数组数据结构),并找到访问该时间来读取该数组的所有元素。 我得到大约17000个滴答,而只有Program1单独执行。 现在,当我首先在另一个选项卡中执行program2(具有空的while循环以保持终止)时,然后运行program1并测量访问时间以读取该数组的所有元素。 令我惊讶的是,与之前只有Program1执行的情况相比,我获得了8000ticks。 看起来只有program1执行时才需要花费更多时间来读取数组,而有2个程序时,program1正在执行与之前相同的任务,而program2通过while循环保持CPU忙。 预计存在program1的访问时间会更长,而实际结果则相反。 为什么会这样? 这是共享库 #include static const int DATA[1024]={1 ,2 ,3,…..1024]; inline void foo(void) { int j, k=0,count=0; for(j=0;j<1024;j++) { k=DATA[j]; } k+=0; } PROGRAM1 int main(void) { foo(); start=timer(); foo(); end=timer(); printf(“Time1=%llu\n”,end-start); start=timer(); foo(); end=timer(); printf(“Time2=%llu\n”,end-start); start=timer(); foo(); end=timer(); printf(“Time3=%llu\n”,end-start); sleep(1); start=timer(); foo(); end=timer(); printf(“after sleep(1)\n”); printf(“Time4=%llu\n”,end-start); start=timer(); foo(); end=timer(); […]

(n – 乘法)vs(n / 2 – 乘法+2加法)哪个更好?

我有一个C程序有n次乘法(单次乘法,n次迭代),我发现另一个逻辑有n / 2次迭代(1次乘法+2次加法)。 我知道两者都是O(n)的复杂性。 但就CPU周期而言。 哪个更快?