【问题标题】:Javascript for loop never ends (10^10 itenerations)Javascript for 循环永远不会结束(10^10 次迭代)
【发布时间】:2015-09-07 18:33:13
【问题描述】:

我有一个“for”循环,它必须循​​环大约 10000000000 次,这样我才能得到 disered 的结果。 然而,它最终总是冻结浏览器...... 'for' 并不是无限工作,但正如我所说,它很长 有什么方法可以解决我的 javascript 问题还是我应该使用另一种语言?

【问题讨论】:

  • 1.为什么需要迭代这么多次? 2. 可能是堆栈溢出(!)
  • 不会是堆栈溢出。在循环中迭代不会添加到堆栈中。大多数浏览器都有运行 javascript 事件的时间限制,而您正在达到该限制。如果您想使用 JavaScript 安装节点并从终端运行它。
  • JS 确实冻结了浏览器,应该只用于更轻或更短的应用程序。
  • 显示您的代码。这与您在 for 循环中所做的事情相关。
  • 尝试使用排序算法来减轻负载:cs.usfca.edu/~galles/visualization/ComparisonSort.html

标签: javascript for-loop


【解决方案1】:

在编译语言中,如果您在循环中几乎什么都不做,您可以在桌面处理器上实现每秒 1,000,000,000 次迭代。所以你的循环需要 10 秒。

如果您的 Javascript 环境被解释(而不是编译),您的迭代可能不会超过 10,000,000 次,并且您的循环将花费 1000 秒(16 分钟)。

如果您在循环中还有一些更昂贵的操作(并且 Javascript 可能会为简单的操作分配内存,这很昂贵),那么您的迭代次数大约为每秒 1,000,000 次,而您的代码需要 10,000 秒(关闭3 小时)。

您可能想考虑一个更好的算法...

【讨论】:

    【解决方案2】:

    您看到的问题是因为 javascript 在浏览器中是单线程的。你的 for 循环在它运行的整个时间里都保持在线程上。问题是该线程还处理与界面的交互。可能还有其他可能性,但我能想到的解决此问题的两种方法是:

    • 使用 Web Worker (docs),但此解决方案不适用于旧版浏览器

    • 如果可能,请将循环分成更小的块,这些块可以使用 setTimeout 运行。处理完每个块后,使用 setTimeout 安排下一个块在 100 毫秒内处理。您将需要使用数字,但这应该释放线程以便它可以响应事件。这将使计算花费更长的时间,但应该使浏览器不会冻结。

    【讨论】:

      【解决方案3】:
      1. 不要这样做。在浏览器中运行这种 Javascript 代码是没有意义的。如果您真的想在客户端执行此操作,则应考虑编写某种浏览器扩展程序,在其中您可以更好地控制 CPU 和本地存储。

      2. 您可能希望将该循环分成更小的块并使用适当的进度系统按顺序运行它们。如果您在谈论循环,假设结果n+1 是基于n 结果,那么多线程系统将无法帮助您。

      3. 考虑使用带有queue 或作业机制的服务器端脚本,并将通知推送到客户端。正如 Teemu 所说,时间(即使在快节奏的情况下)是巨大的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-11
        • 1970-01-01
        • 1970-01-01
        • 2011-01-20
        • 2017-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多