Java 循环代码优化

Java 循环代码优化,java,optimization,loops,Java,Optimization,Loops,我遇到了一个挑战,就是用for循环,以最简单的方式打印出7的倍数(非负数)到50的倍数 我想到了这个(忽略数据类型) for(int i=0;i第二个函数是最好的: O(n)第一个从技术上讲执行较少的运算(没有乘法) 第二个版本的可读性稍高(7的50倍与7的350倍) 可能无法进一步优化 除非您愿意通过以下操作优化多个println调用: StringBuilder s = new StringBuilder(); for(int i = 0; i <= 350; i += 7) s.a

我遇到了一个挑战,就是用for循环,以最简单的方式打印出7的倍数(非负数)到50的倍数

我想到了这个(忽略数据类型)


for(int i=0;i第二个函数是最好的:

O(n)

第一个从技术上讲执行较少的运算(没有乘法)

第二个版本的可读性稍高(7的50倍与7的350倍)

可能无法进一步优化

除非您愿意通过以下操作优化多个
println
调用:

StringBuilder s = new StringBuilder();

for(int i = 0; i <= 350; i += 7) s.append(i).append(", ");

System.out.println(s.toString());
StringBuilder s=new StringBuilder();

对于(inti=0;i,理论上,您的代码更快,因为它不需要每个循环少一条乘法指令

但是,对
System.out.println
(以及整数到字符串的转换)的多次调用将使乘法所需的运行时间变得矮小。要进行优化,请使用a聚合字符串并输出整个结果(或者在内存出现问题时输出结果)


但是,在实际代码中,这不太可能成为瓶颈。配置文件,然后进行优化

如果确实要优化它,请执行以下操作:

System.out.print("0\n7\n14\n21\n28\n35\n42\n49\n56\n63\n70\n77\n84\n91\n98\n105\n112\n119\n126\n133\n140\n147\n154\n161\n168\n175\n182\n189\n196\n203\n210\n217\n224\n231\n238\n245\n252\n259\n266\n273\n280\n287\n294\n301\n308\n315\n322\n329\n336\n343\n350");

它是
O(1)
:)

你想优化它吗?输出部分将花费大约99.99%的时间,而实际的数学计算花费的时间太少,甚至连一个是否优化它的想法都花不上,更不用说如何优化了。当你得到启发,意识到所有这些,甚至更多你不应该担心的理由时,你已经花了无数次没有优化过做这些计算需要花费成千上万次的时间。浪费时间的方法;)有for(int i=0;它最快的执行方式是展开循环并只打印每个数字:
System.out.println(“0”);System.out.println(“7”);System.out.println(“14”);…
。但您在挑战的前提下排除了这一点。:-P然而,“人类可能的最简单方式”可能意味着许多不同的事情;我想它的意思是“最容易维护”和/或“最容易通过查看代码来理解正在发生的事情”,而不是“最快”@德尔南:我可以在我第一次听到“剪头发减肥”这句话的地方找到我的评论但是
i++
i+7
快@fastcodejava:谁说的?即使如此,你能测量出一个差异吗?即使是非常多的迭代?@fastcodejava-你怎么知道
i++
总是比
i+7
快?但是CPU的乘法基本上是加法???@fastcodejava:doing
i++
然后
e> i*7
几乎肯定比只做
i+=7
更昂贵@两个函数都是
O(n)
,渐近复杂性常数在这里实际上是有意义的。第一个函数不是
O(n)
?我知道它们都是O(n)第二种方法的迭代次数更少,因此更优化。当缩放更大的优化次数时,两种方法的迭代次数完全相同,只是步长不同。++更快的方法是将结果保存在一个文件中,只需
cat
it即可。
StringBuilder s = new StringBuilder();

for(int i = 0; i <= 350; i += 7) s.append(i).append(", ");

System.out.println(s.toString());
System.out.print("0\n7\n14\n21\n28\n35\n42\n49\n56\n63\n70\n77\n84\n91\n98\n105\n112\n119\n126\n133\n140\n147\n154\n161\n168\n175\n182\n189\n196\n203\n210\n217\n224\n231\n238\n245\n252\n259\n266\n273\n280\n287\n294\n301\n308\n315\n322\n329\n336\n343\n350");