背景:最近工作中使用聚类算法进行数据分类,采用欧氏距离计算特征矢量的相似度,由于数据维度太大,运算比较耗时,除去使用各种办法减小运算次数外,需要对每一行代码进行优化。
由于每次迭代需要上百亿次的平方运算,原来的代码采用的Math.pow的方法进行平方运算,如果这一个步骤每次都可以节省一些时间,那么对于上百亿次的运算来讲,运算时间将大大缩减。
采用了三种运算方式,进行对比,结果如下(实验数据使用浮点数):
平方运算(耗时单位:ms):
运算次数/耗时 | 1亿次 | 2亿次 | 4亿次 | 8亿次 | 16亿次 |
Math.pow | 1245 | 2499 | 5003 | 9972 | 19932 |
StrictMath.pow | 1905 | 3893 | 7789 | 15531 | 31437 |
x*x | 35 | 69 | 140 | 286 | 549 |
三次方运算(耗时单位:ms):
运算次数/耗时 | 1亿次 | 2亿次 | 4亿次 | 8亿次 | 16亿次 |
Math.pow | 19177 | 38576 | 77039 | 154462 | 312001 |
StrictMath.pow | 20296 | 40507 | 80848 | 162794 | 332476 |
x*x*x | 36 | 70 | 140 | 301 | 587 |
通过实验结果可以看出,pow的性能在大运算量的情况下不是特别理想。