我有一个' for'循环必须循环10000000000次,以便我得到病态的结果。 但是,它一直在冻结浏览器...... 它不是那样的'因为'无限期地工作,但正如我所说,它很长 有没有办法用javascript解决我的问题,或者我应该使用另一种语言?
答案 0 :(得分:0)
在编译语言中,如果您在循环中几乎不做任何操作,您可以在台式机处理器上实现每秒1,000,000,000次迭代。所以你的循环需要10秒钟。
如果您的Javascript环境被解释(而不是编译),您可能不会获得超过10,000,000次迭代,并且您的循环将花费1000秒(16分钟)。
如果你在循环中另外有一些更昂贵的操作(并且Javascript可能为简单的操作分配内存,这是昂贵的),你的每秒大约1,000,000次迭代,你的代码需要10,000秒(关闭)到3个小时)。
您可能想要考虑更好的算法......
答案 1 :(得分:0)
您看到的问题是因为javascript在浏览器中是单线程的。你的for循环在它运行的整个时间内都保持着线程。问题是该线程还处理与接口的交互。可能还有其他可能性,但我能想到的两种解决方法是:
使用Web Worker(docs),此解决方案不适用于旧版浏览器
如果可能,将循环分成可以使用setTimeout运行的较小块。处理完每个块后,使用setTimeout计划下一个要处理的块,例如100ms。您将需要使用数字,但这应该释放线程,以便它可以响应事件。这将使计算花费更长时间,但应该使浏览器不会冻结。
答案 2 :(得分:-1)
不要这样做。在浏览器中运行这种Javascript代码是没有意义的。如果你真的想在客户端这样做,你应该考虑编写某种浏览器扩展,你可以更好地控制CPU和本地存储。
您可能希望将该循环分成较小的块并使用适当的进度系统按顺序运行它们。如果您正在讨论循环,假设结果n+1
基于n
结果,多线程系统将无法帮助您。
考虑使用带有queue
或作业机制的服务器端脚本,只需将通知推送到客户端即可。正如Teemu所说,时间(即使在快节奏的情况下)也是巨大的。