草庐IT

javascript - Google Closure 库的基准测试

coder 2024-12-06 原文

当我搜索 Javascript 库的性能时,我得到许多网站显示以下流行库之间的性能比较

  • jQuery(相当慢)
  • 原型(prototype)(在 IE 中很慢)
  • Dojo(涉及 DOM 时最快)
  • ExtJs(平均)
  • Micro JS(慢但还可以)

但在任何基准测试中,Google Closure Library包含在内。它不像任何其他标准库,据说它是一个过程样式库。

我需要一些关于 Closure 库性能的基准测试。并希望获得有关“在初学者阶段使用 dojo 并在某个中间阶段使用 jQuery 时切换到 Closure 库是否好”的建议

Google 发布它在其所有应用程序(如 Gmail 等)中使用闭包库...性能非常好。这是因为图书馆吗?可以在 JS 中编写 OO 代码的中级 javaScript 编码人员可以将 Closure 库使用到非常高的水平,还是继续使用 DOJO 是明智的。

最佳答案

关于闭包库

Closure 库在风格上与 Dojo 非常接近——实际上,当它首次开发时,作者从 Dojo 中获得了灵感。

但是,Closure 库的速度和功能来自 Closure 编译器,它对 JavaScript 程序进行了大量优化,以消除所有瓶颈(例如导航命名空间链)。

我个人一点也不喜欢它,因为它有损于 Dojo 基于类的构造(只是为了满足编译器)和所有那些 goog.kitchen.sink.getMeACupOfTeaSoICanRelax() 长命名空间让编写(和阅读)JavaScript 程序成为一种皇家痛苦——长命名空间都被编译器优化掉的事实并不会使(对我而言)过度使用它们变得很好,因为你可以 .

此外,它痴迷于让 JavaScript 程序看起来尽可能地面向对象(可能是因为谷歌有大量的 Java 程序员)意味着过度依赖面向对象的概念,如属性 getter 和 setter 并避免许多有用的(和独特的)JavaScript 功能,如 mixin 的。如果您是一名正在学习使用 JavaScript 编程的 Java 程序员,那么使用 Closure Library 将是您的家常便饭。这并没有使它变得优雅。

但是,它确实提供了一个坚如磐石工业实力环境——因为 Google 已经用它构建了巨大网站。这是(在我个人看来)坚固且运行良好但看起来很丑的东西。

但是,Dojo 也坚如磐石,但由于它是一个开源开发项目,所以更加不稳定。您决定是否要切换。

关于闭包编译器和Dojo

实际上,您也可以在高级模式下将 Dojo 与 Closure 编译器一起使用。参见 this link有关如何操作的说明。根据我自己的测试,由 Closure Compiler 编译的程序通常比压缩版本小 25% 左右(由于死代码消除),简单页面的运行速度快 20-30%,大页面的运行速度更快。

一般图书馆的速度

其他库都有自己的特点和怪癖,每个库都在可用性、灵 active 和功能与性能之间取得了平衡。例如,jQuery 会在途中创建许多 jQuery 对象并且会降低性能,尤其是在较旧的浏览器上。但是,现代浏览器,尤其是。 Google Chrome 实际上进行了优化,因此使用 jQuery 对性能的影响最小。

您实际上需要问问自己为什么您需要 JavaScript 才能快速运行。大多数现代浏览器已经相当快了,因此在选择库时这并不是一个非常重要的考虑因素。最好根据它是否适合你(以及你手头的任务)而不是它是否在浏览器中运行快 10 毫秒来选择你的库。

如果您正在为移动设备编写网站,或者编写 HTML5 游戏,您可能需要榨取最后一滴性能(在游戏中)和/或尽可能多地节省资源(在移动设备中)。在这种情况下,我发现使用 Dojo,然后使用 Closure Compiler 进行编译是这种情况下的最佳组合之一。

关于javascript - Google Closure 库的基准测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6416528/

有关javascript - Google Closure 库的基准测试的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  3. ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试? - 2

    我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。

  4. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  5. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  6. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  7. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  8. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

  9. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  10. ruby-on-rails - 如何调试 cucumber 测试? - 2

    我有:When/^(?:|I)follow"([^"]*)"(?:within"([^"]*)")?$/do|link,selector|with_scope(selector)doclick_link(link)endend我打电话的地方:Background:GivenIamanexistingadminuserWhenIfollow"CLIENTS"我的HTML是这样的:CLIENTS我一直收到这个错误:.F-.F--U-----U(::)failedsteps(::)nolinkwithtitle,idortext'CLIENTS'found(Capybara::Element

随机推荐