感谢你们的所有帮助和分享。
我的问题是关于随机搜索的。这种技术通过在一般情况下进行数学计算的定义数量的循环来近似数据。请看以下代码,我尽量将其简化到最低限度。我的期望是将这段代码设置为lambda表达式,特别是for循环,我希望它能达到最佳性能。我有一些尝试,但不确定是否已经充分利用了它。
package stochasticsearch;import java.util.Random;public class StochasticSearch { public static double f(double x) { return -(x - 1) * (x - 1) + 2; } public static void main(String[] args) { final Random random = new Random(); double startPointX = 0; double max = f(startPointX); long begin = System.currentTimeMillis(); for (int i = 0; i < 1000000000; i++) { double index = 2 * random.nextDouble(); if (f(index) > max) { max = f(index); } } System.out.println("Elapsed time: " + (System.currentTimeMillis() - begin)); System.out.println("Maximum value y=f(x) is " + max); }}
谢谢,祝你有美好的一天。
回答:
在我的系统上,你的代码大约在23秒内完成,我对其进行了修改,使其在2秒内完成。以下是我发现的:
- 你使用了
Random
,而你可以使用ThreadLocalRandom
来代替;这种转换会带来相对较大的速度提升。 - 在某些情况下,你在for循环中两次计算了
f(index)
,而它应该在每次迭代中只计算一次。 - 由于你是在一个大的值范围内进行迭代,你可以使用并行流;这也将带来相对较大的速度提升。
-
你在
f
中的每个结果上都加了2
,所以最好在计算出max
后一次性加上它。public static double f(double x) { double y = x - 1; return -y * y;}public static void main(String[] args) { final ThreadLocalRandom random = ThreadLocalRandom.current(); long begin = System.currentTimeMillis(); double max = IntStream.range(0, 1_000_000_000) .parallel() .mapToDouble(i -> f(random.nextDouble() * 2)) .max() .orElse(f(0)) + 2; System.out.println("Elapsed time: " + (System.currentTimeMillis() - begin)); System.out.println("Maximum value y=f(x) is " + max);}