Scala中的模式匹配如何在字节码级别实现? 它是否就像一系列if (x instanceof Foo)构造,还是其他的? 它的性能影响是什么? 例如,给定以下代码(来自Scala示例页面46-48), eval方法的等效Java代码将如何显示? abstract class Expr case class Number(n: Int) extends Expr case class Sum(e1: Expr, e2: Expr) extends Expr def eval(e: Expr): Int = e match { case Number(x) => x case Sum(l, r) => eval(l) + eval(r) } PS我可以读取Java字节码,所以一个字节码表示对我来说就足够了,但是对其他读者来说可能会更好地知道它是怎么样的Java代码。 PPS Scala编程书籍是否给出了有关Scala如何实现的类似问题的答案? 我已经订购了这本书,但还没有到。
所以我们习惯于对每个R新用户说“ apply不是vector化的,查看Patrick Burns R Inferno Circle 4 ”(我引用): 一个常见的反应是在应用系列中使用一个函数。 这不是 vector化,而是循环隐藏 。 apply函数在其定义中有一个for循环。 lapply函数隐藏循环,但执行时间往往大致等于明确的for循环。 实际上,快速查看apply源代码揭示了循环: grep("for", capture.output(getAnywhere("apply")), value = TRUE) ## [1] " for (i in 1L:d2) {" " else for (i in 1L:d2) {" 那么到目前为止,但看一下lapply或vapply实际上揭示了一个完全不同的画面: lapply ## function (X, FUN, …) ## { ## FUN <- match.fun(FUN) ## if (!is.vector(X) || is.object(X)) ## X […]
很多年前,C编译器不是特别聪明。 作为一种解决方法,K&R发明了register关键字,向编译器暗示,将这个variables保存在内部寄存器中可能是个好主意。 他们还让高等运营商帮助生成更好的代码。 随着时间的推移,编译器成熟了。 他们变得非常聪明,因为他们的stream程分析使他们能够做出更好的决定,哪些价值在寄存器中比你可能做的更好。 register关键字变得不重要。 由于别名问题,FORTRAN可能比C更快。 从理论上讲,仔细编码,可以绕过这个限制,使优化器生成更快的代码。 哪些编码实践可以使编译器/优化器生成更快的代码? 确定你使用的平台和编译器,将不胜感激。 为什么这项技术似乎工作? 示例代码是鼓励。 这是一个相关的问题 [编辑]这个问题不是关于整个过程的简介,而是优化。 假设程序编写正确,编译完全优化,testing投入生产。 您的代码中可能存在一些构造,禁止优化器尽其所能地完成最好的工作。 你可以做什么重构,将删除这些禁令,并允许优化器生成更快的代码? [编辑] 偏移相关链接
我们正在开发一个接收和转发“消息”的程序,同时保留这些消息的临时logging,以便它可以在需要时告诉你消息历史。 消息是数字标识的,通常大小在1千字节左右,我们需要保留成千上万条消息。 我们希望优化这个程序的延迟:发送和接收消息之间的时间必须低于10毫秒。 该程序用Haskell编写,并与GHC编译。 但是,我们发现垃圾收集暂停对我们的延迟要求来说太长了:在我们的现实世界程序中超过100毫秒。 以下程序是我们的应用程序的简化版本。 它使用Data.Map.Strict来存储消息。 消息是由Int标识的ByteString 。 按增加的数字顺序插入1000000条消息,并且不断移除最旧的消息以保持历史最多20万条消息。 module Main (main) where import qualified Control.Exception as Exception import qualified Control.Monad as Monad import qualified Data.ByteString as ByteString import qualified Data.Map.Strict as Map data Msg = Msg !Int !ByteString.ByteString type Chan = Map.Map Int ByteString.ByteString message :: Int -> Msg message n = Msg […]
考虑下面的代码( p是unsigned char*的types,而bitmap->width是一些整数types,它是未知的,取决于我们使用的外部库的版本): for (unsigned x = 0; x < static_cast<unsigned>(bitmap->width); ++x) { *p++ = 0xAA; *p++ = 0xBB; *p++ = 0xCC; } 它是值得优化它[..] 有没有这样的情况下,可以写出更有效的结果: unsigned width(static_cast<unsigned>(bitmap->width)); for (unsigned x = 0; x < width; ++x) { *p++ = 0xAA; *p++ = 0xBB; *p++ = 0xCC; } …或者这是编译器优化这个微不足道的? 你认为什么是“更好”的代码? 编者注(艾克):对于那些想知道三文治文本的人来说,原来的这个问题,如同所说的那样,离危险的地方很近,尽pipe得到了正面的反馈,但却非常接近封闭。 这些已经被打破了。 但是,请不要惩罚处理这些问题的答复者。
我们如何检查哪些数据库锁应用于查询批次的哪些行? 任何突出表行级locking的工具实时? DB:SQL Server 2005
假设我们有以下string string data= "/temp string"; 如果我们想删除第一个字符/我们可以通过很多方法来完成,比如: data.Remove(0,1); data.TrimStart('/'); data.Substring(1); 但是..真的我不知道哪一个有最好的algorithm,并做得更快.. 有一个是最好的还是全部都是一样的?
在扩展String.prototype性能的问题之后,我非常感兴趣,因为在String.prototype方法中添加"use strict"可以提高性能10倍。 bergi的解释很短,并没有解释给我。 为什么两种几乎相同的方法之间有如此巨大的差异,只有顶部的"use strict"才有所不同? 你能否更详细地解释这个理论? String.prototype.count = function(char) { var n = 0; for (var i = 0; i < this.length; i++) if (this[i] == char) n++; return n; }; String.prototype.count_strict = function(char) { "use strict"; var n = 0; for (var i = 0; i < this.length; i++) if (this[i] == char) n++; […]
如果你想在Java中使用密码强的随机数,你可以使用SecureRandom 。 不幸的是, SecureRandom可能非常慢。 如果它在Linux上使用/dev/random ,它会阻塞等待足够的熵build立。 你如何避免performance的惩罚? 有没有人使用罕见的math作为解决这个问题? 有人可以证实这个性能问题已经在JDK 6中解决了吗?
C#和F#中的Levenshtein实现。 C#版本比两个约1500字符的string要快10倍。 C#:69毫秒,F#867毫秒。 为什么? 据我所知,他们做的是完全一样的东西? 如果是发行版或debugging版,则无关紧要。 编辑:如果有人来这里专门寻找编辑距离的实施,它被打破。 工作代码在这里 。 C# : private static int min3(int a, int b, int c) { return Math.Min(Math.Min(a, b), c); } public static int EditDistance(string m, string n) { var d1 = new int[n.Length]; for (int x = 0; x < d1.Length; x++) d1[x] = x; var d0 = new […]