到allocate()
或到allocateDirect()
,这就是问题。
多年来,我一直坚持认为,由于DirectByteBuffers
是操作系统级别的直接内存映射,因此与get相比,它在执行get / put调用时将执行得更快HeapByteBuffer
。到目前为止,我从来没有真正对找到有关该情况的确切细节感兴趣。我想知道这两种类型中ByteBuffer
的哪种更快,以及在什么条件下。
操作系统在内存区域上执行I / O操作。就操作系统而言,这些存储区是连续的字节序列。因此,只有字节缓冲区才有资格参与I / O操作就不足为奇了。还记得操作系统将直接访问该进程的地址空间,在本例中为JVM进程,以传输数据。这意味着作为I / O操作目标的存储区必须是连续的字节序列。在JVM中,字节数组可能不会连续存储在内存中,否则垃圾收集器可以随时移动它。数组是Java中的对象,数据在该对象中的存储方式可能因一个JVM实现而异。
因此,引入了直接缓冲区的概念。直接缓冲区旨在与通道和本机I / O例程进行交互。他们尽最大努力将字节元素存储在通道可用于直接或原始访问的内存区域中,方法是使用本机代码告诉操作系统直接耗尽或填充内存区域。
直接字节缓冲区通常是I / O操作的最佳选择。通过设计,它们支持JVM可用的最有效的I / O机制。可以将非直接字节缓冲区传递给通道,但是这样做可能会导致性能下降。非直接缓冲区通常不可能成为本机I / O操作的目标。如果将非直接ByteBuffer对象传递给通道进行写入,则该通道可能会在每次调用时隐式执行以下操作:
直接缓冲区是I / O的最佳选择,但创建起来可能会比非直接字节缓冲区昂贵。直接缓冲区使用的内存是通过调用本地特定于操作系统的代码而绕过标准JVM堆分配的。根据主机操作系统和JVM的实现,设置和拆除直接缓冲区可能比堆驻留缓冲区昂贵得多。直接缓冲区的内存存储区不受垃圾回收的影响,因为它们在标准JVM堆之外。
使用直接缓冲区与非直接缓冲区的性能折衷可能因JVM,操作系统和代码设计而有很大差异。通过在堆外部分配内存,你可能会使你的应用程序受到JVM不了解的其他压力。发挥其他活动部件的作用时,请确保达到预期的效果。我建议使用旧的软件准则:首先使其运行,然后使其快速运行。不必太担心预先的优化;首先专注于正确性。JVM实现可能能够执行缓冲区缓存或其他优化,从而为你提供所需的性能,而无需你付出很多不必要的努力。
在C语言中,假设每个算法被赋予完全相同的一组进程,那么先到先得、最短作业优先和循环之间的周转时间是否相等?还是调度算法不同?
问题内容: 为了为 HTML5 Doctype 定义字符集,我应该使用哪种表示法? 短: 长: 问题答案: 在HTML5中,它们是等效的。使用较短的一个,更容易记住和键入。浏览器支持很好,因为它是为向后兼容而设计的。
连接的多个输入都相当于Yes的时候才会输出Yes。 用法 Your browser does not support the video tag. 案例:小闹钟 功能:今天15:10:00,响起猫叫声小闹钟 工作原理 当所有的输入都是Yes的时候,与节点才输出Yes。
问题内容: 似乎有三种 相同的 方法可以独立于平台获取依赖于平台的“文件分隔符”: 我们如何决定何时使用哪个? 它们之间甚至有什么区别吗? 问题答案: 可以通过调用命令行参数或使用命令行参数覆盖 获取默认文件系统的分隔符。 获取默认文件系统。 获取文件系统的分隔符。请注意,作为一种实例方法,在需要代码在一个JVM中对多个文件系统进行操作的情况下,可以使用该方法将不同的文件系统传递给代码(而不是默认
lxml requests
问题内容: 我今天刚刚与一些同事讨论了python的db-api fetchone vs fetchmany vs fetchall。 我确定每个应用程序的用例都取决于我正在使用的db-api的实现,但是总的来说,fetchone,fetchmany,fetchall的用例是什么? 换句话说,以下等效项是什么?还是其中之一比其他人更受青睐?如果是这样,在哪些情况下? 问题答案: 我认为这确实取决于