这是关于 Node.JS 的更多内容,它使用 V8 引擎。这是也用于 Google Chrome 的 JavaScript 引擎。
我听说 V8 非常快,不仅对于 Node,对于浏览器也是如此。但是,我注意到关于 JavaScript 的一件事是,类型没有针对变量进行编码。
要在 Java 中实现这一点,您需要一个 Object 变量类型来处理所有内容。这在例如 for 循环中的效率会大大降低:
for (var i = 0; i < array.length; i++) {}
我的问题是,V8 如何处理变量类型?它是否知道此 i 变量始终是 int 或 long? (我认为这不太可能,因为 i++ 能够将 long 转换为 double。)
或者 V8 是否以无关紧要的方式处理事情?我认为 JIT 编译器创建的一些简单示例会很有用。 Java 和 JavaScript 都有 JIT 编译器来将代码转换为 C。
我不是 C 程序员,但我很想知道类型是如何处理的,以及 Java 是否真的在该领域更高效。 (是的,我知道 I/O 对于大多数程序来说比类型处理更重要)
最佳答案
一句话:Yes.
V8 将代码编译成中间字节码,然后“热点”由“Crankshaft”编译器分析,如果它确定某些变量永远不会是整数、 double 、字符串等上,它会生成“未装箱”的机器码。
它只对已经遍历过的分支进行这个优化;其他的被推迟,直到有关实际类型的信息由“常规”引擎计算出来,然后注入(inject)到优化代码中。
除此之外,V8 可以将本质上静态的原型(prototype)层次结构转换为“经典”C++ 风格的对象继承,以提高“复杂”类型的性能。
但是,它只能在被称为“经常”的代码上完成所有这些;例如循环或经常调用的函数。
链接到文章(系列的一部分),对此进行了非常非常详细的解释,非常,绝对值得一读。
编辑:但是,当然,像 Java 这样的静态类型语言会在编译时优化尽可能多的代码,因此它应该在除了玩具基准测试之外的所有方面都优于 Javascript。然而,V8 正在缩小两者之间的差距,并且编写 Javascript 比 Java 或 C++ 更“有趣”,因此用户是最大延迟源的初始原型(prototype)设计或程序开发意味着 Javascript 通常是更好的选择,在我看来。
关于javascript - V8 是否检测 int 变量并更有效地处理它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9893361/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案