当前位置: 首页 > 知识库问答 >
问题:

使用sun.misc.unsafe,从直接bytebuffer扫描字节的最快方法是什么?

施自明
2023-03-14
ByteBuffer directBuffer = ByteBuffer.allocateDirect(1024);

问题

假设我的工作是扫描从直接字节缓冲区读回的所有字节,那么对我来说最快的方法是什么?

我最初问“...利用sun.misc.unsafe”,但这可能是错误的假设。

    null

这不同于“我可以使用Unsafe来更快地迭代一个字节[]吗?”问题是,如果没有必要,我甚至不打算在内部将字节拉到byte[]中。

谢谢你抽出时间;只是好奇如果有人(彼得?)做这样的事不安全

共有1个答案

赵高韵
2023-03-14

ByteBuffer方法非常快,因为这些方法是固有的,VM已经将它们映射到非常低级别的指令。比较这两种方法:

    byte[] bytes = new byte[N];
    for(int m=0; m<M; m++)
        for(int i=0; i<bytes.length; i++)
            sum += bytes[i];

    ByteBuffer bb = ByteBuffer.allocateDirect(N);
    for(int m=0; m<M; m++)
        for(int i=0; i<bb.remaining(); i++)
            sum += bb.get(i);

在我的机器上,差异是0.67 ns对0.81 ns(每个循环)。

我有点惊讶ByteBuffer没有Byte[]快。但我认为你绝对不应该把它复制到一个字节[]然后访问。

 类似资料:
  • 问题内容: 我做了一个非常简单的端口扫描程序,但是它运行太慢,因此我正在寻找一种使它扫描速度更快的方法。这是我的代码: 此代码测试是否在特定ip上打开了特定端口。对于超时,我使用了最小值,因为当我降低该值时,它没有足够的时间来测试端口。 它工作正常,但是从0扫描到65535花费的时间太多。还有其他方法可以在不到5分钟的时间内从0扫描到65535吗? 问题答案: 如果您需要为65536个端口中的每个

  • 好吧,所以我试图做一些看起来应该相当简单的事情,但是有了这些新的NIO接口,事情让我很困惑!这是我想做的,我需要扫描文件作为字节,直到遇到某些字节!当我遇到那些特定的字节时,需要抓住数据的那一部分并对其做一些事情,然后继续前进并再次这样做。我本以为在ByteBuffer中有了所有这些标记、位置和限制,我就能做到这一点,但我似乎无法让它工作!这是我到目前为止... 测验正文: Test.java:

  • 问题内容: 好的,所以我试图做的事情看起来应该很简单,但是有了这些新的NIO接口,事情就让我感到困惑!这是我要尝试的操作,我需要以字节为单位扫描文件,直到遇到某些字节为止!当我遇到这些特定字节时,需要获取该数据段并对其进行处理,然后继续并再次执行此操作。我本以为有了ByteBuffer中的所有这些标记,位置和限制,我就可以做到这一点,但是我似乎无法使其正常工作!到目前为止,这就是我所拥有的.. t

  • 问题内容: JDK提供了分配所谓的直接ByteBuffer的能力,其中内存是在Java堆之外分配的。这可能是有益的,因为该内存不会被垃圾收集器占用,因此不会增加GC开销:这对于诸如缓存之类的长期存在的属性非常有用。 但是,现有实现存在一个关键问题:仅当拥有的ByteBuffer被垃圾回收时,底层内存才被异步分配;没有办法强制提前解除分配。这可能是有问题的,因为GC周期本身不受ByteBuffer的

  • 问题内容: 用Java连接两个String的最快方法是什么? 即 我在中使用它作为键,并且在一个非常紧密的循环中调用它来检索值。 当我分析时,这就是瓶颈 问题答案: 这些例程出现在基准测试中的原因是因为这是编译器在幕后实施“ +”的方式。 如果您确实需要连接的字符串,则应让编译器以“ +”号表示神奇。如果你都需要对地图查找一个键,一键类控股与合适的两个字符串,并因为它避免了复制步骤的实现可能是一个

  • 问题内容: 我正在阅读一堆用空格或换行符与标准隔开的整数。 用Java有没有更快的方法呢? 问题答案: 用Java有没有更快的方法呢? 是。扫描仪相当慢(至少根据我的经验)。 如果您不需要验证输入,建议您将流包装在BufferedInputStream中,并使用类似/的内容。 比较一下: 使用此代码读取 17兆字节 (4233600个数字) 我的机器花了 3.3秒 。而这个片段 花了 0.7秒 。