问题描述
我有一个程序,对于类似细胞自动机的程序,我需要在尽可能短的时间内(以毫秒为单位)对类似 List 的对象进行 100,000 到 1,000,000 次随机访问读取.我认为我正在使用的更新算法已经优化(有效地跟踪活动单元格等).列表确实需要更改大小,但性能并不重要.所以我想知道使用 Arrays 而不是 ArrayLists 的性能是否足以在如此短的时间内处理如此多的读取.目前,我正在使用 ArrayLists.
我忘了提及:我只是存储整数,所以另一个因素是使用 Integer 包装类(在 ArrayLists 的情况下)与 ints(在数组的情况下).有谁知道使用 ArrayList 是否实际上需要 3 次指针查找(一次用于 ArrayList,一次用于底层数组,另一次用于 Integer->int),其中数组只需要 1 次(数组地址+偏移量到特定内部)?HotSpot 会优化额外的查找吗?这些额外的查找有多重要?
另外,我忘了提到我还需要进行随机访问写入(写入,而不是插入).
推荐答案
既然您已经提到您的数组实际上是原始类型的数组,请考虑使用 Trove 库.
报告了在他的应用程序中使用 Trove 的显着(十倍!)加速 - 请参阅评论.另一方面是 Trove 集合类型与 Java 的标准集合 API 的类型不兼容.所以 Trove(或类似的库)不会在所有情况下都是答案.
我有大量(> 100k)相对较小的文件(1kb-300kb),我需要阅读和处理。我目前正在浏览所有文件,并使用 File.ReadAllText 读取内容,进行处理,然后读取下一个文件。这是相当慢的,我想知道是否有一种优化它的好方法。
我已经尝试使用多个线程,但是由于这似乎是IO绑定,所以我看不到任何改进。
推荐答案
您很可能是正确的-读取许多文件可能会限制潜在的加速,因为磁盘I / O将成为限制因素。
话虽如此,您很可能可以通过将数据处理传递到单独的线程中来做一些小的改进。
我会建议尝试使用单个生产者线程来读取文件。此线程将受IO限制。在读取文件时,它可以将处理推入ThreadPool线程(.NET 4任务对此也很有效)以进行处理,这将使其立即读取下一个文件。
这将至少节省总运行时间中的处理时间,使您的工作总时间几乎与Disk IO一样快,前提是您拥有额外的核心或两个一起使用…