用于提高执行速度的并发的简单示例是什么? 我发现了许多使用并行性但没有使用并发性的例子。
答案 0 :(得分:4)
并发和并行是两个相关但不同的东西。这个主题很广泛,但让我简单地关注速度。
并发性与如何设计和构建程序有关,如果可以应用并行性,那么软件可以运行得更快。
例如;如果你有一个循环,如
x := []int{1, 2, 3, 4, 5, 6}
for i := range x {
x[i] *= x[i];
}
这个节目"感觉"并发,因为计算数组中每个数字的平方的读写指令在逻辑上彼此独立。因此,理论上您可以以并发方式设计代码,例如使用goroutines:
x := []int{1, 2, 3, 4, 5, 6}
for i := range x {
go func(j int) { x[j] *= x[j]; }(i)
}
wait_the_goroutines();
现在假设此示例中没有数据争用,并且每个更新都可以独立完成。那么,这些值的更新可以并行进行,因为并发设计允许它。使用旧代码,更新是串行设计。
当计算机(CPU,GPU等)能够在同一时间同时处理多个指令时,就会出现并行性。如果您的计算机中有一个核心,则上述goroutines不太可能并行执行。如果你有多个核心,他们可能并行执行 - 因为它们可以,但你没有实际的控制你的计算机并行硬件的使用方式并行执行代码。这是go运行时的任务。
从某种意义上说,并发不是用来提高执行速度的:并行性是。并发用于允许正确的代码并行化。
因此,你无法真正得到这样的例子,因为即使你能得到一个非常并发的"代码,执行速度受限于两件事: