备份和重新读取数据会使速度大大降低。
基于@melpomene评论,这里有一个非常简单的方法
mmap()
:
uint64_t needle;
struct stat sb;
int fd = open( filename, O_RDONLY );
fstat( fd, &sb );
unsigned char *haystack = mmap( NULL, sb.st_size,
PROT_READ, MAP_PRIVATE, fd, 0 );
close( fd );
off_t bytesToSearch = sb.st_size - sizeof( needle );
for ( off_t ii = 0; ii <= bytesToSearch; ii++ )
{
if ( 0 == memcmp( haystack + ii, &needle, sizeof( needle ) ) )
{
}
}
为清晰起见,省略了错误检查和正确的标题。
有很多方法可以提高它的性能。此IO模式是
最差的
可能使用
mmap()
就性能而言,只需读取文件中的每个字节一次,然后丢弃映射。因为映射文件一开始并不那么快,它会影响整个机器。
可能是
大量
使用起来更快
open()
和
read()
将大页面大小的块中的直接IO放入页面对齐的内存中,尤其是当文件占系统RAM的很大一部分时。但这将使代码更加复杂,因为比较必须跨越缓冲区-几乎可以肯定,使用两个缓冲区并复制几个字节来搜索缓冲区之间的断点要比备份和执行非对齐读取快得多。