1
3
以下方法不执行5000000次:
编译生成以下IL:
在Pentium上运行时,我发现它很快就会:
大多数情况下,这只是花费时间增加值,将其与5000000进行比较,如果不相等,则返回几个字节。很可能所有这些都将在一级缓存中。如果手工编码的程序集,它可能会比这个效率高一点,当然,优化它的真正方法是忽略整个过程,但除非这是任何语言所能达到的效果。 总之,重要的不是语言的大小,也不是循环本身。 |
2
2
正如大家所说,循环体中发生的事情是重要的部分(如果这是您的问题,请发布code/psedoo代码)。 我已经编写了一些应用程序(主要是测试驱动程序),它们在循环中分配、使用和处理对象,循环迭代了数百万次。我相信我使用过的最大循环至少有1500万个循环。 机器的结束状态与开始状态相同。““表现好”是主观的,但我对结果很满意。 在fwiw中,有一些进程在windows中无限循环,这表明迭代次数在很多情况下都是不相关的。循环内部发生的事情很重要,但是现代内存分配/处理例程(无论是手动的还是GC自动的)非常能够跟上一个合理的循环。 当然,您可以编写一个繁忙的循环来有意降低系统的性能,例如,向非托管对象打开数百万个句柄,而从不在.NET中处理这些句柄。 编辑:在看到jon的il/assembly之后,似乎IL编译器没有优化掉一个循环,即使它是空的,所以我删除了这个理论。 |
3
0
GC在您的应用程序之外运行,当您达到一个阈值时,它将自动清除它所能清除的内容。在循环体的范围内定义的、不在较低范围内维护的任何内容都将被标记为在GC认为合适的时候进行定稿/收集。 除此之外,一个大循环(500万)没有实际的性能问题(至少没有更多的信息)。它将迭代并做它所做的。 |
4
0
在一个大循环中,尽量避免分配比您需要的更多的对象,否则垃圾收集器将重复地跳入并暂停循环。通常,当应用程序在等待其他东西时,垃圾收集器可以跳入并工作,因此它甚至不明显,但是在一个长循环中,垃圾收集器没有空闲时间可以利用。 如果要访问循环中的大型数组,请尝试以线性方式访问它。这样,您使用的数据大部分时间都在内存缓存中。例如,如果循环二维数组,并将第一个索引作为内部循环,则会在数组中来回跳跃,从而导致更多的缓存未命中。
当然,使用
|
5
0
除了发布的其他答案之外,您还应该避免在GUI应用程序的UI线程/主线程中放置一个长时间运行的循环。如果你在写一个控制台应用程序,这并不重要,但是如果你在写一个winforms或wpf应用程序,这就很重要了。 Windows应用程序的用户界面响应是由消息处理驱动的,如果你进入一个长时间运行的for循环,而没有“腾空”来不时地处理窗口消息,你的用户界面就会冻结,你的用户会认为你的应用程序崩溃了。 您可以将消息处理添加到长运行循环的主体(Delphi/C++VCL中的Appultual.PurrimeMebug)中,但这会导致重新入网的新问题——用户在选择for循环时会导致菜单项递归。 对于一个GUI应用程序来说,最好的选择是在后台线程中放置这样的长时间运行的循环,这样您的UI就可以保持响应。 |
smg_08 · 使用for循环在pandas数据帧中进行筛选[重复] 1 年前 |
stats_noob · R: 记录某个“行为”发生的循环的索引? 2 年前 |
nickolakis · 基于R中的列名复制列 2 年前 |
khalid Morrshid · 循环语法C语言 2 年前 |
Alex · 如何向嵌套字典json添加值? 2 年前 |