【发布时间】:2022-11-15 18:55:38
【问题描述】:
在计算行数时查看 sample implementation of wc.c,它循环遍历文件,一次一个字符并累积 '\n' 以计算换行数:
#define COUNT(c) \
ccount++; \
if ((c) == '\n') \
lcount++;
-
有没有一种方法可以只查找 '\n' 的文件并继续跳转到换行符并进行计数?
-
寻找 '\n' 是否与一次读取一个字符相同,直到我们看到 '\n' 并计算它?
【问题讨论】:
-
你已经问过这个了,答案是否定的,否则 wc 会这样做
-
如果不寻找它们,“寻求”如何知道 '\n' 在哪里?
-
是什么让您认为
\n很特别?如果任务是计算字母a的出现次数,您会问同样的问题吗? -
不幸的是,文件没有表示为某种多维结构,
\n只是另一个字符。所有计算数组中元素出现次数的算法(我知道)都具有线性复杂度。例如。 en.cppreference.com/w/cpp/algorithm/count -
最后,它始终是内存使用和速度之间的权衡。假设您使用的是带有 avx512 的 CPU。您可以将整个文件映射到内存中,然后将其分成与内核数一样多的内存段。确保各分区以 512 位对齐。然后为每个核心启动一个线程(并赋予它与特定核心的线程关联性,以最佳地利用缓存,(MIMD)。然后在每个线程上矢量化搜索'\n',以便可以使用 avx512 检查 64bytes并行(SIMD)。然后你可能仍然需要分析来优化。
标签: c++ string count newline wc