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 . |
Thomas · 使类型别名在F中不可互换# 2 年前 |
sdgfsdh · 我该怎么说。使用异步转换函数进行收集? 6 年前 |
Soldalma · 我可以实例化包含顶级副作用值的类吗? 6 年前 |
matekus · F#-包含数字的字符串的自然排序 6 年前 |
matekus · F#类型匹配-无法创建映射或匹配记录 6 年前 |
Rob Lyndon · 未找到F#ProvidedTypes文件 6 年前 |
red-swan · 如何将intro ML.Net演示翻译为F#? 6 年前 |
jkone27 · F#-在编译时从字符串生成简单的空类型 6 年前 |