![]() |
1
9
与数组的速度差与易变性无关 cache locality . 数组在内存中是连续的,因此它们的迭代速度比列表快:f列表是单独链接的列表,因此每个项可以(通常是)位于不同的内存位置。这意味着您无法从CPU的缓存中获益,而对于数组,一旦您支付了从内存中检索第一个项的成本,那么第二个项到第n个项(其中n的值取决于您检索的项的大小)已经在缓存中,并且几乎可以在坦特检索。如果f有一个immutablearray类,并且您使用了它,那么当通过该immutablearray映射时,您将获得与从可变数组映射时相同的速度优势。 至于您的主要问题,关于何时使用可变变量和并行代码是安全的,简单的测试是问“我 实际上变异 多个线程正在使用的数据?”如果你没有改变你的数据,那么有多个线程并行访问它是安全的。即使数据 能够 变异(例如,数组),只要你没有真正地对它进行变异,那么你的并行代码就不会遇到问题。如果您确实对数据进行了变异,那么您必须处理锁定,以及伴随锁定而来的所有问题,如资源匮乏、死锁等等。 所以简单的经验法则是“变异数据+并行性=痛苦”。如果你改变了你的数据,但没有运行并行代码,你将有更少的痛苦。如果你不改变你的数据,那么并行代码不会给你带来痛苦。但如果你同时做这两件事,就要做好头痛的准备。 |
![]() |
2
3
虽然@rmunn为实际问题提供了一个很好的答案,但我觉得我必须写这篇附录,因为我认为它非常重要,而且太长,不适合在评论中。 这是回答 暗指的 问题,我读作“ 既然可变数据更快,我不应该总是使用可变数据吗? “
事实上,通常情况下,可变的数据结构,如果你把它们弄对了,在表面上会更快,那么我们为什么不一直使用它们呢?如果你做对了,跳转比函数调用要快,这也是事实,所以为什么
don't we use
以上所有问题的答案是 性能并不是软件开发中唯一需要考虑的问题 . 它甚至不是 最重要的 担心。甚至可以说它不在任何地方 近的 最重要的问题。在现代,更重要的是可读性、稳定性、可维护性和整体弹性。 在设计系统时,首先尝试 猜测 在可能存在瓶颈的地方,仔细设计这些地方,并在它们周围放置一些日志和工具。在编写程序时,首先要使它们可读、可理解、可维护。然后,在生产环境中,或者在您负担得起的临时环境中,测量性能。我说的“量度”并不是说“它是最快的吗?”,我的意思是“对我们的目的来说够快吗?”如果是的话,很好。如果不是,找出减速的确切位置,并优化那个位置。久而久之,凭经验,你的 猜测 因为潜在的瓶颈会越来越好。 不要事先尝试优化:到头来你手上会一团糟,你很快就会把它扔掉。 Premature optimization is the root of all evil . |
![]() |
Sam Estep · 这是瞬态的正确用法吗? 7 年前 |
![]() |
s952163 · 递归地将列表解压缩为元素 9 年前 |
![]() |
chris · 在Haskell中创建可变Data.Vector 11 年前 |
|
Ned · 用Java实现数字系统:可变与不可变 11 年前 |
![]() |
6c656c · 具有多个文件的记录的可变字段 12 年前 |