一只名叫tom的猫
只是一个具体的测量点:多年以前,我对哈希算法的两个版本进行了基准测试:unsignedhash( char const* s ){ unsigned h = 0; while ( *s != '\0' ) { h = 127 * h + (unsigned char)*s; ++ s; } return h;}和unsignedhash( char const* s ){ unsigned h = 0; while ( *s != '\0' ) { h = (h << 7) - h + (unsigned char)*s; ++ s; } return h;}在我对其进行基准测试的每台机器上,第一台至少和第二台一样快。令人惊讶的是,有时速度更快(例如在Sun Sparc上)。当硬件不支持快速乘法(大多数都不支持快速乘法)时,编译器会将乘法转换为移位和加/减的适当组合。而且由于它知道最终目标,因此有时可以用比您明确地编写班次和加/减的方式少的指令来实现。请注意,这就像15年前。希望从那时起,编译器只会变得更好,因此您可以指望编译器做正确的事情,可能比您做的更好。(此外,代码看起来如此“ C”的原因是因为它已经超过15年了。std::string今天,我显然会使用和迭代器。)