【问题标题】:Fastest datatype in java for retrieving integers in the same order as storedjava中最快的数据类型,用于以与存储顺序相同的顺序检索整数
【发布时间】:2014-12-17 19:12:26
【问题描述】:

我需要编写一个程序,它会获得非常多的输入整数,大约 10^6 个数字并以相同的顺序处理它们。哪种数据结构将是迭代中最快的..?程序必须在 3 秒内运行。

【问题讨论】:

  • 为什么需要存储它们?只需在阅读时处理它们。
  • 我想你可以使用ArrayListLinkedList(甚至是一个数组)。 10^6 个整数并没有你想象的那么多。
  • 您应该在阅读时处理它们。无论如何,瓶颈将是您的流程,而不是加载下一个数字。但是,如果您知道您将获得多少价值。数组是最快的。

标签: java performance data-structures integer iteration


【解决方案1】:

对于以相同顺序进行的迭代,如果性能是一个关键问题,您可以使用简单的array(但它不允许在不付出额外努力的情况下动态增长数组,因此您通常应该知道最终的大小数组以便使用它)。

您也可以使用List 接口。 LinkedListArrayList 都支持高效的迭代和追加。这使您的代码具有更好的可维护性,但性能稍差。

【讨论】:

    【解决方案2】:

    首先,Premature Optimization is the Root of All Evil。在没有测量程序的实际运行时间的情况下需要“尽可能快地”运行的想法只是无稽之谈。您应该编写清晰简洁的代码,然后仅在需要时测量性能并进行优化。

    也就是说,最快的读取可能是内存映射文件。

      File file = new File( "blah" );
      FileChannel fc = new FileInputStream( file ).getChannel();
      MappedByteBuffer mbb = fc.map( FileChannel.MapMode.READ_ONLY, 0,
              file.length() );
      IntBuffer ib = mbb.asIntBuffer();
    

    但是请注意,Java 在内部使用 NIO 和字节缓冲区,并且通常可以比您更好地优化读取。这是一个声称 small byte buffer reads are actually faster 在某些情况下的网站。

      FileInputStream f = new FileInputStream( "blah" );
      FileChannel ch = f.getChannel();
      ByteBuffer bb = ByteBuffer.allocate( 1024*8 );
      long checkSum = 0L;
      int nRead;
      while( ( nRead = ch.read( bb ) ) != -1 ) {
         if( nRead == 0 )
            continue;
         bb.position( 0 );  // processes the byte buffer, this 
         bb.limit( nRead ); // example just computes a checksum
         while( bb.hasRemaining() )
            checkSum += bb.get();
         bb.clear();
    

    现在请阅读那篇文章并记住在做出假设之前提到的关于衡量性能的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 2019-06-28
      • 2015-07-03
      相关资源
      最近更新 更多