我遇到了很多优化提示,说你应该把你的课程标记为密封,以获得额外的性能好处。 我跑了一些testing来检查性能差异,发现没有。 我做错了什么? 我是否错过了密封课程会给更好的结果? 有没有人运行testing,看到了不同? 帮我学习:)
题 假设你有一个大的ASCII文本文件,每行有一个随机的非负整数,每个范围从0到1,000,000,000。 文件中有100,000,000行。 读通过文件并计算所有整数的总和的最快方法是什么? 约束:我们有10MB的RAM来处理。 这个文件的大小是1GB,所以我们不想把整个文件读入然后处理。 以下是我尝试过的各种解决scheme。 我发现结果相当令人惊讶。 有没有更快的,我错过了? 请注意:下面给出的所有时间是总共运行10次的algorithm(运行一次并丢弃;启动计时器;运行10次;停止计时器)。 这台机器是一个相当慢的Core 2 Duo。 方法1:自然的方法 首先要尝试的是明显的方法: private long sumLineByLine() throws NumberFormatException, IOException { BufferedReader br = new BufferedReader(new FileReader(file)); String line; long total = 0; while ((line = br.readLine()) != null) { int k = Integer.parseInt(line); total += k; } br.close(); return total; } 请注意,最大可能的返回值是10 ^ […]
我做了一些时间testing,还读了一些像这样的文章(最后一条评论),看起来像在发布构build,浮点数和双精度值采取相同的处理时间量。 这怎么可能? 当float与double值相比精确度和精度较低时,CLR如何能够在相同的处理时间内翻倍? 编辑: 完全重复的“ 比c中的花车快两倍 ”
假设我有一个ArrayList ArrayList<MyClass> myList; 我想打电话给arrays,有没有一个性能的原因使用 MyClass[] arr = myList.toArray(new MyClass[myList.size()]); 过度 MyClass[] arr = myList.toArray(new MyClass[0]); ? 我更喜欢第二种风格,因为它不那么冗长,我认为编译器会确保空数组并不真正被创build,但是我一直在想这是不是真的。 当然,在99%的情况下,这种方式并没有什么不同,但是我希望在我的正常代码和优化的内部循环之间保持一致的风格。
注意:如果您也遇到此问题,请在Apache JIRA上加注: https://issues.apache.org/jira/browse/XALANJ-2540 我得出了一个惊人的结论: Element e = (Element) document.getElementsByTagName("SomeElementName").item(0); String result = ((Element) e).getTextContent(); 似乎是一个令人难以置信的100倍比这更快: // Accounts for 30%, can be cached XPathFactory factory = XPathFactory.newInstance(); // Negligible XPath xpath = factory.newXPath(); // Negligible XPathExpression expression = xpath.compile("//SomeElementName"); // Accounts for 70% String result = (String) expression.evaluate(document, XPathConstants.STRING); 我正在使用JVM的JAXP默认实现: org.apache.xpath.jaxp.XPathFactoryImpl org.apache.xpath.jaxp.XPathImpl 我很困惑,因为很容易看出JAXP如何优化上述XPath查询来实际执行一个简单的getElementsByTagName() 。 但似乎并没有这样做。 这个问题被限制在5-6个经常使用的XPath调用中,这些调用被API抽象和隐藏。 […]
说我有一个string,看起来像这样: str = "The &yquick &cbrown &bfox &Yjumps over the &ulazy dog" 您会注意到string中存在和号的位置很多,后面跟着一个字符(例如“&y”和“&c”)。 我需要用字典中的适当值replace这些字符,如下所示: dict = {"&y":"\033[0;30m", "&c":"\033[0;31m", "&b":"\033[0;32m", "&Y":"\033[0;33m", "&u":"\033[0;34m"} 什么是最快的方法来做到这一点? 我可以手动查找所有&符号,然后循环查看字典来更改它们,但是这似乎很慢。 做一堆正则expression式replace似乎也很慢(我将有一个约30-40对在我的实际代码字典)。 任何build议表示赞赏,谢谢。 编辑: 正如在这个问题的评论中已经指出的那样,我的字典是在运行时定义的,在应用程序生命周期中决不会改变。 这是一个ANSI转义序列的列表,并将有大约40个项目在其中。 我的平均string长度将比较大约500个字符,但会有一些是5000个字符(虽然,这些将是罕见的)。 我目前也在使用Python 2.6。 编辑#2我接受Tor Valamos的答案是正确的,因为它不仅提供了一个有效的解决scheme(尽pipe这不是最好的解决scheme),而是考虑到所有其他方面,并做了大量的工作来比较所有的问题。 这个答案是我在StackOverflow中遇到的最好,最有帮助的答案之一。 荣誉给你。
我碰到这两个方法来连接string: 共同部分: char* first= "First"; char* second = "Second"; char* both = malloc(strlen(first) + strlen(second) + 2); 方法1: strcpy(both, first); strcat(both, " "); strcat(both, second); 方法2: sprintf("%s %s", first, second); 在这两种情况下,两者的内容将是"First Second" 。 我想知道哪一个更高效(我必须执行几个级联操作),或者如果你知道更好的方法来做到这一点。 谢谢你的时间。 编辑:在第一种情况下,空间可能已经在一个string内。
我发现在C和C#中类似的代码之间有巨大的性能差异。 C代码是: #include <stdio.h> #include <time.h> #include <math.h> main() { int i; double root; clock_t start = clock(); for (i = 0 ; i <= 100000000; i++){ root = sqrt(i); } printf("Time elapsed: %f\n", ((double)clock() – start) / CLOCKS_PER_SEC); } 而C#(控制台应用程序)是: using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication2 { class Program { static void […]
我有一个模拟,有一个巨大的总和,结合步骤正确的中间。 我使用plyr的ddply()函数对这个过程进行了原型devise,这对于我的需求来说非常有用。 但是我需要这个聚合步骤,因为我必须运行10K模拟。 我已经并行扩展了模拟,但如果这一步更快,我可以大大减less我需要的节点数量。 这是我想要做的合理的简化: library(Hmisc) # Set up some example data year <- sample(1970:2008, 1e6, rep=T) state <- sample(1:50, 1e6, rep=T) group1 <- sample(1:6, 1e6, rep=T) group2 <- sample(1:3, 1e6, rep=T) myFact <- rnorm(100, 15, 1e6) weights <- rnorm(1e6) myDF <- data.frame(year, state, group1, group2, myFact, weights) # this is the step I want […]
我想为我的Java代码(一种单线程的本地复杂algorithm)提供一些性能指标(主要是运行时)。 (所以我不想要一个macros基准测量一个JVM实现。) 随着工具,我想 分析复杂性 ,即查看我的代码如何为参数n(search深度)进行缩放。 (我已经有了参数化的junittesting) 做一些趋势分析得到警告,如果代码基地的一些改变使代码变慢。 为此,我想使用一个工具或框架 做统计 ,最佳地计算均值,标准差和置信区间。 这个非常重要。 可以参数化 (见上面的参数n)。 这也是非常重要的。 是能够产生花哨的情节会不错,但不是必需的 可以在自动化(junit)testing中用来警告我,如果我的程序慢了,但这也不是必需的,只是一个加号。 哪些工具/框架可以满足这些要求? 哪一个很适合复杂性和趋势分析,为什么?