在AWK中:
{
for (i=1;i<=NF;i++) {
if ($i in good) g++ ;
if ($i in bad ) b++ ;
}
}
Perl中的:
while (<>) {
foreach $word ( split ) {
if (exists($good{$word})) { $g++ } ;
if (exists( $bad{$word})) { $b++ } ;
}
}
我做错了什么?我认为某些perl会更快。
加载“好”和“坏”哈希不是问题,因为输入比情感词列表大得多。
答案 0 :(得分:1)
垃圾收集。由split()创建的未命名数组仍然在堆上为每一行创建,并最终被deref'd和GC'd。该数组的每个元素都被复制到$ word,并且$ word本身在范围退出时被解析,最终被GC'd。
awk没有任何废话,因为它不是一种通用语言。 awk脚本通过字段索引,底层字段数组只分配一次并在程序的生命周期中重用(因为这就是awk所做的 - 总是将每一行拆分成单词)。