【问题标题】:Can loop unrolling or duff's help this situation?循环展开或 duff 可以帮助这种情况吗?
【发布时间】:2010-10-15 01:45:57
【问题描述】:

我正在使用这段代码将一些大型 ajax responseText 重新格式化为良好的二进制数据。它可以工作,虽然速度很慢。

我正在处理的数据可能高达 8-10 兆。

我需要让这段代码绝对高效。如何将循环展开或 Duff 的设备应用于此代码,同时仍保持我的二进制数据完好无损,或者是否有人看到任何可以更改的有助于提高速度的内容?

    var ff = [];
var mx = text.length;   
var scc= String.fromCharCode;
for (var z = 0; z < mx; z++) {
    ff[z] = scc(text.charCodeAt(z) & 255);
}
var b = ff.join("");
this.fp=b;
return b;

谢谢 帕特

【问题讨论】:

标签: javascript optimization


【解决方案1】:

你的时间猪不是循环。是这样的:ff[z] = scc(text.charCodeAt(z) &amp; 255); 你是否在逐渐增长ff?那肯定是一头猪。

如果你只是在调试器下运行它并暂停它,我敢打赌你会在ff的增长过程中看到它。预分配。

【讨论】:

  • 并不是说这不会产生影响,但我更怀疑它会产生很大的不同......或改进。如果你有测试表明否则,您应该发布它们。
  • @Shog9:也许push 是添加元素的最佳方式。无论如何,我怀疑for 循环不是时间去的地方。
  • @Mike:我同意你的观点,WRT 循环位不是一个重要因素。数组性能在不同浏览器之间差异很大(甚至在浏览器版本之间),字符串连接与 array.join() 的相对性能也是如此。我想从 OP 那里看到更多关于他在哪里运行以及它实际运行速度有多慢的信息 - 我宁愿怀疑他可以通过切换到正则表达式(本机代码)显着改善问题一路)。
  • @Shog9:它正在 webos 移动应用程序中运行。它在我的 Mac 上的模拟器上运行没有故障,但是在实际的移动设备上,它冻结了。所以我认为更优化的代码 sn-p 版本或从使用 for/loop 到使用展开机制的逻辑更改可能会有所帮助。该代码是从这个 mozilla 页面的“二进制处理”部分开发的:developer.mozilla.org/en/Using_XMLHttpRequest 它提供了处理来自 ajax 请求的二进制数据的功能:var abyte = filestream.charCodeAt(x) & 0xff;我需要迭代整个 ajax responseText。有什么建议吗?
  • @cube:我们总是在这样的台词中听到:“它冻结了。所以我想...... XXX......可能会有所帮助”。它可能会,也可能不会,因为你不知道它会。就像您将线性搜索与二进制搜索进行比较一样。线性搜索选择元素只是因为它们“可能”是正确的。二分搜索根据实际信息做出决策。你需要做同样的事情。如果应用程序似乎死机了,那么你很幸运,因为通过这种方法很容易找出原因:stackoverflow.com/questions/3743504/…
【解决方案2】:

将数据转换为服务器上的 JSON 数组。即使使用原生 JSON 引擎,8/10 兆字节也需要很长时间。我不确定为什么 JS 应用程序需要 8/10 兆的数据。如果您要下载到客户端的设备,请将其转换为他们期望的格式并链接到它。然后他们可以自己下载和处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2011-08-15
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多