@
zungmou 还需要提供两个profile数据,w/wo count loop,用来判断瓶颈是c#的磁盘读还是count
另外,count loop那部分代码不够优化,我对c#不熟,用熟悉的c给你贴示例代码
chatr*cp_last = buffer + read;
char *cp = buffer;
while (cp < cp_last) {
_count[*cp++]++;
}
read = _viewAccessor.ReadArray(_position, buffer, 0, buffer.Length);
这段代码也很诡异,读文件怎么还要指定position呢,反正你都是顺序读,linux是这么定义文件读api的
ssize_t read(int fd, void *buf, size_t count);
如果要指定位置,则有pread函数
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
我不确定指定position会不会导致磁盘移动开销
还有一个奇怪的地方,既然你用到了MemoryMappedFile ,我理解和linux下的mmap是类似的东西,可是linux下的mmap之后,就可以直接当内存读取了,根本就不再需要有read操作。
对c#实在不熟悉,比如MemoryMappedViewAccessor这层封装是不是会引起额外的内存开销,以及由此触发的gc开销,拼性能的时候,api封装越少越好。
讲速度,必须要有硬件条件为前提,cpu主频、硬盘类型(SSD OR SATA OR RAID10),内存总线速度。
一会我在atom小机器上写段c代码测试一下。