Perl 我想知道seek的效率
我目前正在研究体育结构。 我试图用perl而不是C来解析它 这不是一件重要的事情,但是如果你读取一个二进制文件,你必须跳转到某个部分。(例如,重新阅读e_lfan) 我想读取点0x78处的数据,该点由$buf使用0x200数据读取 这里有两种方法可以提取0x78处的数据Perl 我想知道seek的效率,perl,pack,seek,unpack,Perl,Pack,Seek,Unpack,我目前正在研究体育结构。 我试图用perl而不是C来解析它 这不是一件重要的事情,但是如果你读取一个二进制文件,你必须跳转到某个部分。(例如,重新阅读e_lfan) 我想读取点0x78处的数据,该点由$buf使用0x200数据读取 这里有两种方法可以提取0x78处的数据 my ($ dummy, $ data) = unpack ("A0x78 A*", $buf); or seek (F, 0x78,0); read F, $buf, 0x200; print ~ 我想知道这两种方法中哪一种
my ($ dummy, $ data) = unpack ("A0x78 A*", $buf);
or
seek (F, 0x78,0); read F, $buf, 0x200; print ~
我想知道这两种方法中哪一种比减去虚拟数据、读取数据和通过seek读取新数据更有效。驱动器的最小存储单元被称为。对于硬盘驱动器,它们的大小通常为512字节(尽管您也可以找到具有4096字节扇区的驱动器) 您的文件跨越两个扇区
000 078 200 278 400
+--------------+--------------+---...
| ****************
+--------------+--------------+---...
由于感兴趣的区块部分位于第一个扇区,因此您所描述的两种方法都需要读取相同数量的扇区
因为实际上从磁盘读取数据是比较慢的,所以这两种方法之间没有真正的区别
哦,但是您使用的是缓冲IO而不是
sysread
。当使用缓冲IO(例如,read
)时,Perl以4kib或8kib块(取决于您的Perl版本)从操作系统中读取。因此,如果您从位置0开始读取,则从磁盘加载8或16个扇区;如果您先seek
,则从磁盘加载9或17个扇区。因此,通过尝试少读,你实际上读得更多
也就是说,这种差异非常小,以至于速度差异会在噪音中消失。驱动器的最小存储单元称为。对于硬盘驱动器,它们的大小通常为512字节(尽管您也可以找到具有4096字节扇区的驱动器) 您的文件跨越两个扇区
000 078 200 278 400
+--------------+--------------+---...
| ****************
+--------------+--------------+---...
由于感兴趣的区块部分位于第一个扇区,因此您所描述的两种方法都需要读取相同数量的扇区
因为实际上从磁盘读取数据是比较慢的,所以这两种方法之间没有真正的区别
哦,但是您使用的是缓冲IO而不是
sysread
。当使用缓冲IO(例如,read
)时,Perl以4kib或8kib块(取决于您的Perl版本)从操作系统中读取。因此,如果您从位置0开始读取,则从磁盘加载8或16个扇区;如果您先seek
,则从磁盘加载9或17个扇区。因此,通过尝试少读,你实际上读得更多
也就是说,这种差异非常小,以至于速度差异应该在噪音中消失。(1)和(2)您所展示的是无与伦比的:在一种情况下,您使用
解包
,在另一种情况下,您使用读取
数据;(不考虑缓冲)是否比较内存中的工作和磁盘读取?最后一句不清楚。提示:使用x
而不是A
跳过字节而不返回字节提示:使用A
而不是A
获取二进制数据A将通过test删除尾随的0x20
这将为您留下my$data=unpack(“x0x78 A*”,$buf)代码>哇,我第一次注意到名为“x”的解包功能。感谢您让我知道(1)和(2)您展示的是无与伦比的:在一种情况下,您使用解包
,在另一种情况下,您使用读取
数据;(不考虑缓冲)是否比较内存中的工作和磁盘读取?最后一句不清楚。提示:使用x
而不是A
跳过字节而不返回字节提示:使用A
而不是A
获取二进制数据A将通过test删除尾随的0x20
这将为您留下my$data=unpack(“x0x78 A*”,$buf)代码>哇,我第一次注意到名为“x”的解包功能。谢谢你让我知道