我一直试图通过循环展开来优化一些极其关键的性能问题代码(在蒙特卡洛模拟中被称为数百万次的快速sortingalgorithm)。 这里是我试图加速的内部循环: // Search for elements to swap. while(myArray[++index1] < pivot) {} while(pivot < myArray[–index2]) {} 我试图展开到像这样的东西: while(true) { if(myArray[++index1] < pivot) break; if(myArray[++index1] < pivot) break; // More unrolling } while(true) { if(pivot < myArray[–index2]) break; if(pivot < myArray[–index2]) break; // More unrolling } 这完全没有区别,所以我把它改回到更易读的forms。 其他时候我也有类似的经历,我试过循环展开。 鉴于现代硬件上的分支预测器的质量,何时循环展开仍然是一个有用的优化?
在iPhone或其他便携式硬件上对CPU密集型或GPU密集型应用程序进行编程时,必须做出明智的algorithm决策,才能使代码更快速。 但是,如果您使用的语言比另一种语言执行得更差,即使是很好的algorithmselect也会变慢。 是否有任何比较Objective-C到C ++的硬数据,特别是在iPhone上,但可能只是在Mac桌面上,以performance各种类似的语言方面? 我对这篇比较C和Objective-C的文章非常熟悉,但这是将两种面向对象的语言相互比较的一个更大的问题。 例如,C ++的vtable查询是否比Obj-C消息更快? 快多less? 线程,多态性,sorting等。在我去寻求build立一个具有重复对象模型和各种testing代码的项目之前,我想知道是否有人已经做了这个以及结果在哪里。 这种types的testing和比较本身就是一个项目,可能需要相当长的时间。 也许这不是一个项目,但只有两个产出可以比较。 我正在寻找硬数据 ,而不是传福音。 就像你们中的许多人一样,我因各种原因而爱和恨两种语言。 而且,如果有人在那里积极追求同样的事情,我会很有意思地在代码中看到最终的结果,而且我相信其他人也会有帮助。 我的猜测是,他们都有优势和弱点,我的目标是要找出他们是什么,以便他们可以避免/利用在现实世界的情况下。
我一直在考虑用Python进行快速的扑克手评估。 我想到一种加速这个过程的方法就是把所有的牌面和代表作为素数,并把它们放在一起代表手牌。 白衣: class PokerCard: faces = '23456789TJQKA' suits = 'cdhs' facePrimes = [11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 53, 59, 61] suitPrimes = [2, 3, 5, 7] 和 def HashVal(self): return PokerCard.facePrimes[self.cardFace] * PokerCard.suitPrimes[self.cardSuit] 这会给每只手一个数字值,通过模数可以告诉我手中有多less个国王,或者多less颗心。 例如,任何有5个或更多的俱乐部的手均匀分配2 ^ 5; 任何有四位君王的手将会以59 ^ 4等分。 问题是像AcAdAhAsKdKhKs这样的七张牌的牌的散列值大约为62.7万亿次,这将花费比32比特大得多的内部代表。 有没有办法在Python中存储这么大的数字,这将允许我对它执行算术运算?
我只是偶然发现了一些事情。 起初我以为这可能是一个分支预测错误的例子 ,但是我无法解释为什么分支错误预测会导致这种现象。 我实现了两个版本的Bubble Sort Java,并进行了一些性能testing: import java.util.Random; public class BubbleSortAnnomaly { public static void main(String… args) { final int ARRAY_SIZE = Integer.parseInt(args[0]); final int LIMIT = Integer.parseInt(args[1]); final int RUNS = Integer.parseInt(args[2]); int[] a = new int[ARRAY_SIZE]; int[] b = new int[ARRAY_SIZE]; Random r = new Random(); for (int run = 0; RUNS > […]
我正在开发Android游戏。 它使用表面视图并使用提供的那种标准2D绘图API。 当我第一次发布游戏的时候,我正在做各种各样的愚蠢的事情,比如在每个框架上重新绘制9个补丁,同样用文本。 我已经通过绘制到位图对象并绘制它们的每一帧,只有在需要时重新绘制到位图对象上优化了大部分。 我收到了有关电池耗尽的投诉,并且在我进行修改之后,我希望(科学地)了解是否进行了改进。 不幸的是,我没有任何先前的数据,因此将性能与其他游戏进行比较将是最有用的。 我一直在运行Traceview,并使用它的结果主要用于识别CPU耗时的方法。 那么 – 确定我的应用程序的电池性能的最好方法是什么,什么是好的基准? 我知道我可以通过设置来查看不同应用程序的%s,但这又是不科学的,因为我从中得到的数字也取决于所有其他应用程序中发生的情况。 我已经浏览了Google的大部分文档,尽pipe消息很明显,你应该节省电池(偶尔也会提示如何),但我几乎没有什么迹象表明我可以测量我的应用程序执行。 我想要的最后一件事是在Android Market上更多地抱怨电池漏电! 提前致谢。 编辑 感谢您提供的所有有用的build议。 我真正想知道的是, 如何使用来自Traceview的数据(例如,在游戏的每一帧上花费的CPU时间,以ms为单位)来确定电池使用情况 (如果这是可能的话)。 回想我原来的问题,我可以看到我有点模糊。 再次感谢。
是否有可能有一个零执行时间的循环? 我认为,即使是一个空循环应该有一个执行时间,因为有一个相关的开销。
我正在处理一个生成一些Excel文档的脚本,我需要将一个数字转换为它的列名相同。 例如: 1 => A 2 => B 27 => AA 28 => AB 14558 => UMX 我已经写了一个algorithm来这样做,但我想知道是更简单还是更快的方法来做到这一点: function numberToColumnName($number){ $abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; $abc_len = strlen($abc); $result_len = 1; // how much characters the column's name will have $pow = 0; while( ( $pow += pow($abc_len, $result_len) ) < $number ){ $result_len++; } $result = […]
有没有代码在VBA我可以包装一个function,这将让我知道所花费的时间,以便我可以比较不同的运行时间的function?
什么是从Java中的String中去除所有不可打印字符的最快方法? 到目前为止,我已经尝试和测量了138字节,131字符的string: String的replaceAll() – 最慢的方法 517009结果/秒 预编译模式,然后使用匹配器的replaceAll() 637836结果/秒 使用StringBuffer,使用codepointAt()逐个获取代码codepointAt()并追加到StringBuffer 711946结果/秒 使用StringBuffer,使用charAt()逐个获取字符并追加到StringBuffer 1052964结果/秒 预先分配一个char[]缓冲区,使用charAt()逐个获取字符并填充此缓冲区,然后转换回string 2022653结果/秒 预先分配2个char[]缓冲区 – 旧的和新的,使用getChars()立即获取现有string的所有字符, getChars()迭代旧缓冲区并填充新缓冲区,然后将新缓冲区转换为string – 我自己的最快版本 每秒2502502个结果 与2缓冲区相同的东西 – 只使用byte[] , getBytes()和指定编码为“utf-8” 857485结果/秒 与2 byte[]缓冲区相同的东西,但指定编码作为一个常量Charset.forName("utf-8") 791076结果/秒 与2 byte[]缓冲区相同的东西,但指定编码为1字节的本地编码(只是一个理智的事情) 370164结果/秒 我最好的尝试是以下几点: char[] oldChars = new char[s.length()]; s.getChars(0, s.length(), oldChars, 0); char[] newChars = new char[s.length()]; int newLen = 0; for (int j […]
所以,我有这个代码: constexpr unsigned N = 1000; void f1(char* sum, char* a, char* b) { for(int i = 0; i < N; ++i) { sum[i] = a[i] + b[i]; } } void f2(char* sum, char* a, char* b) { char* end = sum + N; while(sum != end) { *sum++ = *a++ + *b++; } } […]