我是如何击败Java自带排序算法的
作者:网络转载 发布时间:[ 2015/9/6 11:14:28 ] 推荐标签:测试开发技术 编程语言
我运用JMH来作为测试基准。为了简单起见,我用整形数组进行测试。在1000.000 到10.000.0000 数量级的均匀分布的数组中,我的算法表现的好。尽管我写的快速排序算法在一定程度上比不过Java自带的算法,但是我的预处理过程很好的弥补了这些不足(调用了我的快速排序的Bleedsort 87ms vs Java 自带算法105ms; 938ms vs 1.144s)
Benchmark Mode Cnt Score Error Units Corrected
MyBenchmark._1e6U sample 8512 0.024 ± 0.001 s/op
MyBenchmark._1e7U sample 985 0.236 ± 0.001 s/op
我生成了下面这些正确的基准数组
MyBench.int1e6UQuickSort sample 1641 0.131 ± 0.001 s/op 0.107 ± 0.002
MyBench.int1e6UBleedSort sample 2410 0.087 ± 0.001 s/op 0.063 ± 0.002
MyBench.int1e6UJavaSort sample 1978 0.105 ± 0.001 s/op 0.081 ± 0.002
MyBench.int1e7UQuickSort sample 200 1.483 ± 0.014 s/op 1.459 ± 0.015
MyBench.int1e7UBleedSort sample 373 0.938 ± 0.009 s/op 0.914 ± 0.010
MyBench.int1e7UJavaSort sample 200 1.144 ± 0.009 s/op 1.120 ± 0.010
所以,我的这个没有特殊优化的算法程序在这些数据集上要比Java自带算法快大概 10-15% 。
在1000.000数据级,包含 10% 或者 1% 的随机重复数据的均匀增加数据集上,我的算法表现的也不差。
Benchmark Mode Cnt Score Error Units Corrected
._1e6Iwf010 sample 20705 9.701 ± 0.033 ms/op
._1e6Iwf001 sample 148693 1.344 ± 0.003 ms/op
生成正确的基准数组
.int1e6Iw010BleedSort sample 4159 49.377 ± 0.571 ms/op 39.68 ± 0.60
.int1e6Iw010JavaSort sample 3937 52.139 ± 0.229 ms/op 42.44 ± 0.25
.int1e6Iw010QuickSort sample 3899 52.457 ± 0.210 ms/op 42.76 ± 0.23
10% 重复数据
.int1e6Iw001BleedSort sample 6190 32.821 ± 0.219 ms/op 31.48 ± 0.22
.int1e6Iw001JavaSort sample 8113 24.910 ± 0.079 ms/op 23.57 ± 0.08
.int1e6Iw001QuickSort sample 8653 23.367 ± 0.056 ms/op 22.02 ± 0.06
^^ 1%
但是,这个算法在只有10.000左右的小二项分布的数据集 (~bin(100,0.5))(译者加:考虑到括号里面是公式代码,并没有修改内部英文括号符号成中文符号)上表现的很差。 在这些数组中,平均下来,出现50这个数字的次数是795.5,而出现40组重复数组的次数是108.4。
同时,在排序1000.0000量级的大数组的时候,这个算法要比 Arrays.sort() 慢两倍左右。这些数组都有很多的重复数据(比如有的大小为1e6的数组里只有450个不同的数值)。
Benchmark Mode Cnt Score Error Units Corrected
._1e4bin100 sample 152004 1.316 ± 0.001 ms/op
^^ for correction
.int1e4bin100BleedSort sample 148681 1.345 ± 0.001 ms/op 0.029 ± 0.002
.int1e4bin100JavaSort sample 150864 1.326 ± 0.001 ms/op 0.010 ± 0.002
.int1e4bin100QuickSort sample 146852 1.362 ± 0.001 ms/op 0.046 ± 0.002
.int1e6bin1e4BleedSort sample 75344 2.654 ± 0.005 ms/op -
.int1e6bin1e4JavaSort sample 146801 1.361 ± 0.002 ms/op -
.int1e6bin1e4QuickSort sample 76467 2.615 ± 0.005 ms/op -
在排序小型的(10.000, 100.000)均匀随机数组下,这个算法表现尚可,但是并不比系统算法更好。
MyBench.int1e4UBleedSort sample 216492 0.924 ± 0.001 ms/op 0.683 ± 0.002
MyBench.int1e4UJavaSort sample 253489 0.789 ± 0.001 ms/op 0.548 ± 0.002
MyBench.int1e4UQuickSort sample 217394 0.920 ± 0.001 ms/op 0.679 ± 0.002
MyBench.int1e5UBleedSort sample 18752 0.011 ± 0.001 s/op 0.009 ± 0.002
MyBench.int1e5UJavaSort sample 22335 0.009 ± 0.001 s/op 0.007 ± 0.002
MyBench.int1e5UQuickSort sample 18748 0.011 ± 0.001 s/op 0.009 ± 0.002
总而言之,在内存不是很紧张的情况下,针对适当的大数据集,我会建议把分布搜索算法做为一个有效的补充选项。
后,让大家来认识一下二项分布的一些数据集 bin(100, 0.5) 和 bin(1000, 0.5),
这里是两个随机抽样了100个数据的数据集(使用R语言生成)。
> rbinom(100, 100, 0.5)
[1] 43 49 51 47 49 59 40 46 46 51 50 49 49 45 50 51 50 49 53 52 45 53 48 56 45
[26] 47 55 47 53 53 56 41 47 42 51 51 46 49 49 52 46 48 49 50 48 56 54 49 53 52
[51] 54 48 45 45 50 48 54 49 52 50 48 48 49 45 54 54 50 41 53 45 51 48 53 52 52
[76] 50 53 47 55 47 60 54 52 56 45 46 54 46 38 43 53 45 62 48 52 52 52 49 52 56
> rbinom(100, 1000, 0.5)
[1] 515 481 523 519 524 516 498 473 523 514 483 496 458 506 507 491 514 489
[19] 475 489 485 507 486 523 521 492 502 500 503 501 504 482 518 506 498 525
[37] 498 491 492 479 506 499 505 497 510 479 504 510 485 488 495 519 522 490
[55] 517 511 511 488 519 508 475 521 505 493 480 498 490 492 492 476 490 506
[73] 496 505 521 518 506 509 477 483 509 493 497 501 483 502 470 515 519 509
[91] 510 496 477 508 506 481 490 511 498 476
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
Java性能测试有哪些不为众人所知的原则?Java设计模式??装饰者模式谈谈Java中遍历Map的几种方法Java Web入门必知你需要理解的Java反射机制知识总结编写更好的Java单元测试的7个技巧编程常用的几种时间戳转换(java .net 数据库)适合Java开发者学习的Python入门教程Java webdriver如何获取浏览器新窗口中的元素?Java重写与重载(区别与用途)Java变量的分类与初始化JavaScript有这几种测试分类Java有哪四个核心技术?给 Java开发者的10个大数据工具和框架Java中几个常用设计模式汇总java生态圈常用技术框架、开源中间件,系统架构及经典案例等
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南