草庐IT

javascript - JavaScript 中多维数组或对象数组之间的性能

coder 2025-04-02 原文

我必须从我的 API 加载大量数据,并且我可以选择获取数据的格式。我的问题是关于性能和选择最快的格式来加载查询并能够像在 JavaScript 中一样快速读取它。

我可以有一个二维数组:

[0][0] = true;
[0][1] = false;
[1][2] = true;
[...]
etc etc..

或者我可以有一个对象数组:

[
{ x: 0, y: 0, data: true},
{ x: 0, y: 1, data: false},
{ x: 1, y: 2, data: true},
[...]
etc etc..
] 

我找不到任何基准来比较 GET 请求,数据量很大。如果有任何地方,我很乐意阅读它!

题目的第二部分是读取数据。我将有一个循环,需要获取每个坐标的值。

我假设直接在二维数组中查找坐标会比在每个循环中查找每个对象更快。还是我错了?

这两种格式中的哪一种加载和读取最快?

谢谢。

最佳答案

对于关于 GET 请求的问题的第一部分,我认为数组的加载速度会稍微快一些,但根据您的数据,它很可能可以忽略不计。我的依据是,如果去掉空格,则数组中每个成员的示例数据为 12 个字节,而类似对象的示例数据为 20 个字节。如果您的实际数据也是如此,理论上只有 3/5 的数据要传输,但除非您获得大量数据,否则可能不会产生明显的差异。

回答您问题的第二部分:任何代码的性能都将在很大程度上取决于您的特定用例的细节。对于大多数情况,我认为最重要的一点是:

  • 对象明显更具可读性和用户友好性

也就是说,当性能/速度成为问题和/或高优先级时(听起来您可能就是这种情况),肯定有一些事情需要考虑。虽然它涉及写入数据而不是读取数据,但我发现了 this good comparison of the performance of arrays vs objects这提出了一些有趣的观点。在 Windows 7 64 位上使用 Chrome 45.0.2454.101 32 位多次运行上述测试时,我发现这些要点通常是正确的:

  • 数组将始终接近最快,即使不是最快
  • 如果对象的长度已知/可以硬编码,则有可能使它们的性能接近甚至有时优于数组

在上面链接的测试中,这段使用对象的代码在我的一个测试中以 225 ops/sec 的速度运行:

var sum = 0;
for (var x in obj) {
  sum += obj[x].payload;
}

与在同一测试中使用以13,620 ops/sec 运行的数组的此代码相比:

var sum = 0;
for (var x = 0; x < arr.length; ++x) {
  sum += arr[x].payload
}

但是,需要注意的重要一点是,这段使用具有硬编码长度的对象的代码在同一测试中以 14,698 次操作/秒 的速度运行,超过了上述各项:

var sum = 0;
for (var x = 0; x < 10000; ++x) {
  sum += obj[x].payload
}

综上所述,这可能取决于您的特定用例,哪种性能最佳,但希望这能给您一些考虑因素。

关于javascript - JavaScript 中多维数组或对象数组之间的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32520755/

有关javascript - JavaScript 中多维数组或对象数组之间的性能的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  3. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  4. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  5. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  6. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  7. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  8. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  9. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  10. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

随机推荐