循环展开或 duff 可以帮助这种情况吗?

Posted

技术标签:

【中文标题】循环展开或 duff 可以帮助这种情况吗?【英文标题】:Can loop unrolling or duff's help this situation? 【发布时间】: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 中逐字节处理 8-10MB 的速度很慢感到惊讶吗?我们在这里说话有多慢?另请参阅:Why is array.push sometimes faster than array[n] = value? 【参考方案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......可能会有所帮助”。它可能会,也可能不会,因为你不知道它会。就像您将线性搜索与二进制搜索进行比较一样。线性搜索选择元素只是因为它们“可能”是正确的。二分搜索根据实际信息做出决策。你需要做同样的事情。如果应用程序似乎死机了,那么你很幸运,因为通过这种方法很容易找出原因:***.com/questions/3743504/…【参考方案2】:

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

【讨论】:

以上是关于循环展开或 duff 可以帮助这种情况吗?的主要内容,如果未能解决你的问题,请参考以下文章

循环展开与循环平铺

前端性能优化:循环优化二,循环展开

迭代 const 容器时编译器会展开“for”循环吗?

如何在 C++ 中展开嵌套的 for 循环?

为啥 clang 无法展开循环(即 gcc 展开)?

循环展开和优化