Tag: optimization

对于三种情况的排列,最快的算法是什么?

有人可以帮我解决在最小步骤中评估三个条件的最快方法吗? 我有三个条件,如果两个中的任何一个都是真的,那么整个表达式变为true否则为false 。 我试过两种方法: if ((condition1 && condition2) || (condition1 && condition3) || (condition2 && condition3)) 另一种方法是通过引入变量i和 i = 0; if (condition1) i++; if (condition2) i++; if (condition3) i++; if (i >= 2) //do something 我想要比上面两个更好的任何其他有效方法。 我在内存受限的环境中工作(Atmeta8具有8 KB的闪存)并且需要一个在C中工作的解决方案。

包含许多“if”的临界循环,其输出是常量:如何保存条件测试?

我的代码中有一个关键循环,具有以下形状: int myloop(int a, …..){ /* some stuff */ // Critical loop while(…){ /* Some Stuff */ if(a == 1){ // ….. } else if(a == 2){ // ….. } else if(a == 3){ // ….. } else{ // …. } } } 由于循环从不接触“a”的值,所采用的分支将永远不会改变,但由于此循环非常重,因此需要多次测试“a”的值,这是完全没有必要的。 最好的事情可能是复制循环,以便在循环开始之前可以测试“if”,但这意味着复制了两种情况共同的许多东西,并将导致非常难看的代码…… 有没有办法要求GCC / G ++在编译时复制这段代码? 或者其他任何避免测试这么多次的技巧? 谢谢您的帮助 ! Nathann

许多情况下的交换机优化可确保任何情况下的访问时间均等 (C ++)

我已经在这里看到了特定语言的答案,关于使用跳转表优化超过5个案例的开关,以保证任何情况下的持续访问时间。 C / C ++是这样的吗? 它特别适用于gcc吗? 对于视觉工作室? 如果没有,按发生频率顺序对案例进行排序有帮助吗?

在不同优化级别以gcc / g ++访问本地变量和全局变量的速度

我发现gcc中的不同编译器优化级别在循环中访问本地或全局变量时会产生完全不同的结果。 这让我感到惊讶的原因是,如果访问一种类型的变量比访问另一种变量更可优化,我认为gcc优化会利用这一事实。 这里有两个例子(在C ++中,但它们的C对应物实际上给出了相同的时间): global = 0; for (int i = 0; i < SIZE; i++) global++; 它使用全局变量long global ,vs. long tmp = 0; for (int i = 0; i < SIZE; i++) tmp++; global = tmp; 在优化级别-O0,时间基本相等(如我所料),在-O1它稍快但仍然相等,但是从-O2使用全局变量的版本要快得多(大约7倍)。 另一方面,在下面的代码片段中,起始点指向大小为SIZE的字节块: global = 0; for (const char* p = start; p < start + SIZE; p++) global […]

打开多个档案的大中央战略

我有一个使用Grand Central调度队列的工作实现:(1)打开文件并在“queue1”上计算OpenSSL DSA哈希,(2)将哈希写出到新的“side car”文件,以便稍后validation“queue2” 。 我想同时打开多个文件,但是基于一些不会通过打开100个文件并超过硬盘驱动器可持续输出而“阻塞”操作系统的逻辑。 照片浏览应用程序(如iPhoto或Aperture)似乎打开多个文件并显示它们,所以我假设可以这样做。 我假设最大的限制是磁盘I / O,因为应用程序可以(理论上)同时读写多个文件。 有什么建议? TIA

常见C ++优化技术列表

我可以获得一系列常见的C ++优化实践吗? 我的意思是优化是你必须修改源代码才能更快地运行程序,而不是改变编译器设置。