for循环太慢了

     2023-03-07     234

关键词:

【中文标题】for循环太慢了【英文标题】:For loop is too slow 【发布时间】:2016-01-01 13:01:38 【问题描述】:

我有以下代码:

var Combinatorics = require('js-combinatorics');
var fs = require('fs');

cp = Combinatorics.cartesianProduct(
    ["4", "@", "/\\", "/-\\", "^", "∂", "λ", "α", "(!", "Z", "α"], ["1²", "2", "?", "P\\", "[\"/_", "l\"/_", "|-", "|2", "|?", "®", "12", "/2", "I2", "|^", "|~", "(r)", "|`", "l2", "Я", "ʁ", "я"], ["#", "(-)", ")-(", "/-/", "4", "<~>", "[-]", "\\-\\", "]-[", "]~[", "-", "=", "|-|", "|~|", "", ":-:", "-", "н"], ["!", "'", "1", "[]", "][", "|", "¦", "¡", ":", "]", "ι"], ["&", "3", "€", "£", "ë", "[-", "|=-", "ə", "ε"]
);

for(var index = 0; index < cp.length; ++index) 
    //may be not the best idea, but in this way I will add new line to each word when saving them into array
    var aux = cp.toArray()[index] + '\n';
    console.log(cp.toArray()[index])
    var contents = fs.appendFile("./output.txt", aux,
        function(error) 
            if(error) 
                console.log("error writing");
            
        );

它将生成411642个单词并将它们从新行“\n”保存到output.txt中

如果我生成的单词数量不多,此代码运行速度很快,但在我的情况下,要生成 411642 个单词,我使用 output.txt 中的“\n”从换行符编写它们。我使用此代码的速度约为 82 个字/1 分钟。它超级慢。我不明白为什么?我怎样才能让它更快?

【问题讨论】:

欢迎来到组合数学的世界。您生成了一个呈指数增长的结果集。 Javascript 不是最快的语言。 @EricJ。那么我可以在这里使用什么最简单、最快速的方式来获取我的单词表)? 如果您正在使用 console.log 运行循环,请将其删除,它会使其更快。 不知道为什么会有这么多反对票,这是一个写得很好的问题,而且很清楚 OP 想要什么...... @dandavis this console.log console.log(cp.toArray()[index]) ,不是 appendFile 回调中的那个 【参考方案1】:

你应该做一个字符串插值或创建一个数组,然后将值推送给它。

最后,您将追加整个字符串,或使用Array.prototype.join 将其转换为字符串。

for 循环很快,问题在于 I/O。看看下面的例子:

var Combinatorics = require('js-combinatorics');
var fs = require('fs');

var cp = Combinatorics.cartesianProduct(
  ["4", "@", "/\\", "/-\\", "^", "∂", "λ", "α", "(!", "Z", "α"],
  ["1²", "2", "?", "P\\", "[\"/_", "l\"/_", "|-", "|2", "|?", "®", "12", "/2", "I2", "|^", "|~", "(r)", "|`", "l2", "Я", "ʁ", "я"],
  ["#", "(-)", ")-(", "/-/", "4", "<~>", "[-]", "\\-\\", "]-[", "]~[", "-", "=", "|-|", "|~|", "", ":-:", "-", "н"],
  ["!", "'", "1", "[]", "][", "|", "¦", "¡", ":", "]", "ι"],
  ["&", "3", "€", "£", "ë", "[-", "|=-", "ə", "ε"]
);

fs.appendFile('./output.txt', cp.toArray().join('\n'), function(error) 
  if (error)
    console.log('Error writing ' + error);
);

注意:我在这里做的另一件事是将cp.toArray() 缓存到一个变量中,因此您不需要在每次循环迭代时调用它一次。做这两件事(只写一次文件,也只调用一次.toArray(),你会有更好的性能,完全确定。


更新

我刚刚意识到你根本不需要循环,因为你唯一要做的就是为你拥有的每个单词连接一个 \n,你可以通过调用 Array.prototype.join 方法来做到这一点.

【讨论】:

【参考方案2】:

在任何使用文件 I/O 的循环中,您首先要检查的是如何最小化文件操作,因为这通常比 CPU 任务慢几个数量级。

这段代码只是在很多方面设计错误。对于初学者,不要将每个单词一次一个单词写入文件,并为每个单词调用fs.appendFile()。打开文件一次。然后使用缓冲 I/O(如流)进行写入,这样您就不会为每个单词都打开、写入、关闭文件。或者,将所有单词收集到一个数组中,然后一次全部写入。

另外,您在 for 循环的中间放置了一个异步操作,这将使您的系统过载,因为它不可能同时启动和执行那么多异步操作(它们最终会得到由系统排队)。

【讨论】:

谢谢,但是我怎样才能只打开一次文件呢?以及如何使用缓冲 I/O? @cebit933 - 呃,在循环之前打开文件。在循环期间将所有单词收集到一个数组中,然后在循环结束时将它们全部写出并关闭文件。这是文件 I/O 基础知识。您还可以使用将为您缓冲的文件流。

C++ 时间测量看起来太慢了

...且我正在应用一种游戏开发技术,该技术包括测量游戏主循环的每次迭代所消耗的时间,因此您可以使用它来按比例更新游戏场景上次更新了。为了实现这一点,我在循环开始时有这个:voidlogicLoop()floatfinalTime=(f 查看详情

Python'for'循环性能太慢

】Python\\\'for\\\'循环性能太慢【英文标题】:Python\'for\'loopperformancetooslowPython\'for\'循环性能太慢【发布时间】:2020-07-2721:03:40【问题描述】:我的数据框中有超过500,000行和许多类似的“for”循环,这导致我的代码需要一个多小时... 查看详情

sqlmap太慢了

】sqlmap太慢了【英文标题】:sqlmapistooslow【发布时间】:2012-07-0506:46:16【问题描述】:这是一个例子。只是想列出数据库:pythonsqlmap.py-u"http://somesite.com/?id=1"--dbs[15:20:32][INFO]fetchingdatabasenames[15:20:32][INFO]fetchingnumberofdatabases[... 查看详情

iPad 中的洪水填充太慢了

】iPad中的洪水填充太慢了【英文标题】:FloodfillinginiPadtooslow【发布时间】:2011-05-0901:19:28【问题描述】:我在iPad上为我的一个着色应用程序使用洪水填充。该应用程序基本上在图像的黑线内填充颜色,我可以毫无问题地做到这... 查看详情

InAppReview : SKStoreReviewController 太慢了

】InAppReview:SKStoreReviewController太慢了【英文标题】:InAppReview:SKStoreReviewControllerSoSlow【发布时间】:2017-09-2213:03:59【问题描述】:使用SKStoreReviewController进行inAppReview需要时间,直到出现提示,有什么方法可以让它显示得更快?另... 查看详情

插入 WStandardItemModel 太慢了

】插入WStandardItemModel太慢了【英文标题】:InsertinginaWStandardItemModelistooslow【发布时间】:2011-07-0417:59:53【问题描述】:我正在开发一个基于WT构建的应用程序。我们遇到了性能问题,因为它必须在与WStandardItemModel关联的WTableView中... 查看详情

Ucanaccess 太慢了

】Ucanaccess太慢了【英文标题】:Ucanaccessistooslow【发布时间】:2016-04-2708:03:07【问题描述】:我已正确添加了所有必要的JARS:Ucanaccess3.0.4commons-lang-2.6commons-logging-1.1.1hsqldbdjackcess-2.1.3我的数据库是100MB。仅使用Jacksess时,相同的查... 查看详情

为啥使用 information_schema 太慢了?

】为啥使用information_schema太慢了?【英文标题】:Whyisusinginformation_schematoomuchslow?为什么使用information_schema太慢了?【发布时间】:2017-02-2607:34:33【问题描述】:这是我的代码://dbssize$sql=\'SELECTtable_schemaDB_Name,Round(Sum(data_length+inde... 查看详情

获取数百万条记录太慢了

】获取数百万条记录太慢了【英文标题】:FetchingMillionsRecordsgoingtooslow【发布时间】:2018-07-3010:47:29【问题描述】:我正在尝试使用带有Fetching的聚集索引复制其他表中的6000万条记录。但是在2000万张唱片之后,它变得太慢了。我... 查看详情

导航到包含 ScrollView 的 ViewController 太慢了

】导航到包含ScrollView的ViewController太慢了【英文标题】:NavigatingtoViewControllercontainingScrollViewGoingtooSlow【发布时间】:2016-01-1807:55:50【问题描述】:这就是从ViewControllerA推送到ViewControllerB的方式UIStoryboard*mainStory=[UIStoryboardstoryboardW... 查看详情

呈现视图控制器太慢了

】呈现视图控制器太慢了【英文标题】:PresentingViewControlleristooslow【发布时间】:2020-05-2000:08:29【问题描述】:我已经在我的Swift应用中实现了FirebaseGoogle登录。我想在开始时检查它是否已经是登录用户。我是这样做的:overridefun... 查看详情

MySQL查询太慢了

】MySQL查询太慢了【英文标题】:MySQLquerytoomuchslow【发布时间】:2019-05-1423:21:59【问题描述】:我正在尝试查询以获取一些趋势统计数据,但基准测试真的很慢。查询执行时间约为134秒。我有一个名为table_1的MySQL表。在create语句... 查看详情

UIAlertController 在 iOS 9.3 中太慢了

】UIAlertController在iOS9.3中太慢了【英文标题】:UIAlertControlleristooslowiniOS9.3【发布时间】:2016-10-3123:35:19【问题描述】:在iOS9.3中执行任何按钮操作时,UIAlertController太慢。不确定是iOS9.3的问题还是缺少正确配置的内容。UIAlertContro... 查看详情

setFormulaArray 太慢了

】setFormulaArray太慢了【英文标题】:setFormulaArraytooslow【发布时间】:2021-06-0807:02:33【问题描述】:我正在尝试编写一个python包装器,该包装器旨在从csv(或mysql)读取多个记录并更新工作表预定义范围的值,该范围由值单元格和... 查看详情

Vscode typescript 样式的组件太慢了

】Vscodetypescript样式的组件太慢了【英文标题】:Vscodetypescriptstyledcomponenttooslow【发布时间】:2020-10-1008:32:58【问题描述】:当我使用styledcomponent时,我的vscode类型检查太慢了我已经多次搜索过这个问题,但我在hit-hub上发现了一... 查看详情

Alamofire 序列化太慢了

】Alamofire序列化太慢了【英文标题】:AlamofireSerializationisTooSlow【发布时间】:2018-02-1321:27:43【问题描述】:由于某种原因,我需要很长时间进行序列化。我正在使用Alamofire和ObjectMapper来处理请求响应并将数据反序列化为对象。... 查看详情

谷歌云部署太慢了

】谷歌云部署太慢了【英文标题】:GoogleClouddeploysoslow【发布时间】:2017-03-0504:06:30【问题描述】:我正在使用GoogleCloudNodeJS托管。当我将应用程序部署到GoogleCloud时,我感到非常惊讶。每次部署都非常慢。第一次可能会很慢,但... 查看详情

Rails Assets 预编译太慢了~12hrs

】RailsAssets预编译太慢了~12hrs【英文标题】:RailsAssetsprecompileistooslow~12hrs【发布时间】:2014-02-2406:28:11【问题描述】:我是本地预编译资产likethisRAILS_ENV=productionbundleexecrakeassets:precompile,但是12小时太慢了。我不知道会发生什么!... 查看详情