Tag: 优化

为什么不总是使用Python代码的psyco?

psyco似乎对优化Python代码非常有帮助,而且它以一种非侵入性的方式进行。 因此,人们不得不怀疑。 假设你总是使用x86架构(这是大多数应用程序最近运行的地方),为什么不总是使用psyco来处理所有的Python代码呢? 它有时会犯错误,破坏程序的正确性吗? 增加运行时的一些奇怪的情况? 你有没有消极的经历呢? 到目前为止,我最负面的经验是它使我的代码更快了15%。 通常情况下会更好 当然,使用psyco并不能取代高效的algorithm和编码。 但是,如果你可以改善你的代码的性能两行(导入和调用psyco)的成本,我没有理由不要。

Resharper:可能的IEnumerable的多个枚举

我正在使用新的Resharper版本6.在我的代码中的几个地方,它已经强调了一些文本,并警告我可能会有一个可能的IEnumerable多个枚举 。 我理解这意味着什么,并在适当的时候采纳了build议,但在某些情况下,我不确定这实际上是一个大问题。 像下面的代码一样: var properties = Context.ObjectStateManager.GetObjectStateEntry(this).GetModifiedProperties(); if (properties.Contains("Property1") || properties.Contains("Property2") || properties.Contains("Property3")) { … } 它强调每一个提到的properties在第二行,警告我多次枚举这个IEnumerable。 如果将.ToList()添加到第1行的末尾(将properties从IEnumerable<string>转换为List<string> ),则警告消失。 但是,如果将其转换为List,那么它将枚举整个IEnumerable来首先构buildList,然后根据需要枚举List以查找属性(即1个完全枚举和3个部分枚举)。 而在我原来的代码中,只做了3个部分枚举。 我错了吗? 这里最好的方法是什么?

如何确保编译器优化不会引入安全风险?

我必须编写一个Windows服务来处理某些机密数据(如PIN码,密码等)。 这些信息需要很短的时间:通常它们几乎立即被发送到智能卡读卡器。 让我们考虑这段代码: { std::string password = getPassword(); // Get the password from the user writePasswordToSmartCard(password); // Okay, here we don't need password anymore. // We set it all to '\0' so it doesn't stay in memory. std::fill(password.begin(), password.end(), '\0'); } 现在我关心的是编译器优化。 在这里编译器可能会检测到密码即将被删除,并且在这一点上改变它的值是无用的,只需要删除这个呼叫。 我不希望我的编译器关心未来未被引用的内存的价值。 我的担心是否合法? 我怎样才能确定这样一段代码不会被优化?

为什么将类定义为final可以提高JVM的性能?

从http://sites.google.com/site/gson/gson-design-document引用: 为什么Gson中的大多数课程都被标记为final? 虽然Gson通过提供可插入序列化器和反序列化器提供了一个相当可扩展的体系结构,但Gson类并不是专门devise为可扩展的。 提供非最终的类将允许用户合法地扩展Gson类,然后期望该行为在所有后续的修订中都能正常工作。 我们select通过将类标记为final来限制这种使用情况,并等待一个好的用例出现以允许可扩展性。 标记一个类最终还有一个小优点,即为Java编译器和虚拟机提供额外的优化机会。 这是为什么? [如果我猜测:JVM知道类是final的,它不维护方法覆盖表? 还有其他原因吗?] 性能有什么好处? 这是否适用于频率实例化的类(POJO?),或者适用于持有静态方法的类(实用程序类)? 定义为最终的方法在理论上也可以提高性能? 有什么影响吗? 谢谢,Maxim。

logging器slf4j格式化的优点是{}而不是string连接

有没有使用{}而不是string连接的优势? 来自slf4j的一个例子 logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT); 代替 logger.debug("Temperature set to"+ t + ". Old temperature was " + oldT); 我认为这是关于速度优化,因为参数评估(和string连接)可以在运行时避免取决于configuration文件。 但是只有两个参数是可能的,有时除了string连接之外没有别的select。 对这个问题需要看法。

JS:从string中的path中删除文件名的最佳方法?

我有string格式如下: path/to/a/filename.txt 现在我想做一些string操作,这使得我可以非常有效地从这段代码中删除“filename.txt”部分。 换句话说,我希望我的string变成这样: path/to/a/ 什么是最有效的方法来做到这一点? 目前我正在分割string,并重新连接除了最后一个单独的元素,但我感觉这是一个真正的,低效的方法来做到这一点。 这是我目前效率低下的代码: res.getPath = function(file) { var elem = file.split("/"); var str = ""; for (var i = 0; i < elem.length-1; i++) str += elem[i] + "/"; return str; }

获得上个月的第一天和最后一天的最佳方式?

我正在寻找最好的方法来获得上个月的第一天和最后一天。 我使用它们进行SQL查询来获取上个月的统计信息。 我认为这是最好的方式,更优化,但不是更多,任何人有另一种方式做同样的? $month_ini = date("Ymd", mktime(0, 0, 0, date("m", strtotime("-1 month")), 1, date("Y", strtotime("-1 month")))); $month_end = date("Ymd", mktime(0, 0, 0, date("m", strtotime("-1 month")), date("t", strtotime("-1 month")), date("Y", strtotime("-1 month")))); 谢谢!!

C#是'types检查结构奇怪的.NET 4.0 x86优化行为

更新:我已经提交了Microsoft Connect的错误报告 ,请投票! 更新2:微软已经将bug报告标记为已修复 由微软于18/08/2010在17:25发布 该错误将在未来版本的运行时中修复。 恐怕现在判断是否会在服务包或下一个主要版本中还为时过早。 由于升级到VS2010,我得到一些非常奇怪的行为与“is”关键字。 下面的程序(test.cs)在debugging模式(对于x86)编译时输出True,在(对于x86)优化编译时输出False。 编译x64或AnyCPU中的所有组合会给出预期结果,即True。 在.NET 3.5下编译的所有组合都会给出预期的结果,True。 我正在使用下面的batch file(runtest.bat)来编译和testing使用编译器.NET框架的各种组合的代码。 有没有人在.NET 4.0下看到过这种types的问题? 当运行runtests.bat时,其他人是否在计算机上看到和我一样的行为? @ $ @#$? 有没有解决这个问题? test.cs中 using System; public class Program { public static bool IsGuid(object item) { return item is Guid; } public static void Main() { Console.Write(IsGuid(Guid.NewGuid())); } } runtest.bat @echo off rem Usage: rem runtest — […]

我可以在Java代码中做什么来优化CPUcaching?

在编写Java程序时,是否对CPU如何利用其caching来存储数据有影响? 例如,如果我有一个访问了很多的数组,如果它足够小以适应一个caching行(通常是64位机器上的128字节),是否有帮助? 如果我在这个限制内保留了一个很多使用的对象,我可以期待它的成员所使用的内存靠近在一起并保持在caching中吗? 背景:我正在构build一个压缩的数字树 ,这受到了Judyarrays的启发,这个arrays是C语言的。虽然我主要使用节点压缩技术,但是Judy将CPUcaching优化作为中心devise目标,节点types为以及它们之间切换的启发式方法受到了很大的影响。 我想知道我是否有机会获得这些好处呢? 编辑 : 到目前为止的答案的一般build议是,不要试图微远优化机器级别的细节,当你离机器太远,因为你在Java中。 我完全同意,所以觉得我不得不添加一些(希望)澄清的意见,以更好地解释为什么我认为这个问题仍然是有道理的。 这些如下: 由于计算机的构build方式,计算机处理起来通常比较容易。 我已经看到Java代码在压缩数据上(来自内存)运行明显更快,即使解压缩必须使用额外的CPU周期。 如果数据存储在磁盘上,那么显然这是为什么,但是当然在RAM中这是相同的原理。 现在,计算机科学有很多东西要说,例如,C语言中的引用的位置是很好的,我猜它在Java中仍然很棒,甚至更有可能,如果它有助于优化运行时间来做更聪明的事情。 但是,你是如何完成的可能是非常不同的。 在C中,我可能会编写pipe理大块内存的代码,并使用相邻的指针来处理相关的数据。 在Java中,我不能(也不想知道)内存是如何被特定的运行时pipe理的。 所以我不得不把优化提高到一个更高的抽象层次。 我的问题基本上是,我该怎么做? 对于参考的地点来说,“在一起”意味着什么在我正在Java中进行抽象的层面上呢? 同一个对象? 同types? 同一arrays? 总的来说,我不认为抽象层改变了“物理定律”,比喻来说。 即使不再调用malloc() ,每次用尽空间时将数组的大小加倍也是Java中的一个好策略。

使用google.load('jQuery',…)与直接包含托pipe脚本URL有什么优势?

Google托pipe了一些stream行的JavaScript库: http : //code.google.com/apis/ajaxlibs/ 根据谷歌: 加载库最强大的方法是使用google.load()… 使用什么是真正的优点 google.load("jquery", "1.2.6") 与 <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script> ?