Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 我想知道seek的效率_Perl_Pack_Seek_Unpack - Fatal编程技术网

Perl 我想知道seek的效率

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 ~ 我想知道这两种方法中哪一种

我目前正在研究体育结构。 我试图用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 ~

我想知道这两种方法中哪一种比减去虚拟数据、读取数据和通过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”的解包功能。谢谢你让我知道