问题描述 我有一个程序对于类似细胞自动机的程序我需要在尽可能短的时间内(以毫秒为单位)对类似 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一样快前提是您拥有额外的核心或两个一起使用…
【感谢龙石为本站提供数据治理平台技术支撑 http://www.longshidata.com/pages/government.html】