请提出将下面的C代码编写到长生不老药的更好的方法(更多长生不老药的方法)。
int some_num = 0;
for(int i = 0; i < 100; i++){
for(int j = 0; j < 1000; j++){
for(int k = 0; k < 10000; k++){
some_num += 1;
}
}
}
printf("%d", some_num);
Run Code Online (Sandbox Code Playgroud)
并可以通过获得收益的长生不老药并发来实现它吗?
编辑:有点背景,我对长生不老药仍然学习。该问题的主要动机是编写比应用并发更多的惯用e剂代码。
完全实现所编写内容的最简单方法是使用for宏:
sum =
for i <- 0..100,
j <- 0..1_000,
k <- 0..10_000,
reduce: 0 do
acc -> acc + 1
end
Run Code Online (Sandbox Code Playgroud)
编辑:
:reduce新版本的Elixir(1.8+)中提供了该选项。在旧版本中,您可以使用nested Enum.reduce/3:
Enum.reduce(0..100, 0, fn _, acc ->
acc + Enum.reduce(0..1_000, 0, fn _, acc ->
acc + Enum.reduce(0..10_000, 0, fn _, acc ->
acc + 1
end)
end)
end)
Run Code Online (Sandbox Code Playgroud)
关于问题的第二部分:不,该循环不会从并发中获得太多收益,如果以任何方式改变时间,那么循环只会更慢。在这种特殊情况下,可以这样写:sum = 100 * 1_000 * 10_000它可以更快,因为可以很容易地被编译器优化10_000_000(IIRC Erlang编译器无法优化给定的常量循环)。
TL; DR这种明显的循环无法通过并发来改善,并且在一般情况下很难说进程(即并行化)是否会有所帮助。记住这一点也很重要parallel != concurrent,因此,N在具有N-1调度程序(默认为CPU数量)的计算机上运行Erlang的进程将不会加速。
| 归档时间: |
|
| 查看次数: |
166 次 |
| 最近记录: |