# SpeedTest **Repository Path**: redspid/SpeedTest ## Basic Information - **Project Name**: SpeedTest - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2013-10-19 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #测试 Java 字符串操作性能 主要测试 String 类的 `indexOf`和正则匹配的效率。 同时测试 `LinkedList` 的迭代器操作和删除效率。 ##搜索字符串 从文件(names)读取1万个字符串,存为`LinkedList` 在72个字符中随机选择,生成1万个字符串,字符串长度 [5,12] byte , 不能完全避免重复,但重复概率极低。 `NamesGen.java` 默认输出到标准输出,用 `ant namegen` 生成测试数据 ##被搜索字符串 从文件(data)读取10万行字符串,放入 `StringBuilder` 在72个字符中随机选择,每行长度70个字符。 `DataGen.java` 默认输出到标准输出,用 `ant datagen` 生成测试数据 Perl 程序(DataGen.pl)生成数据。 为避免 IO 实现影响测试效果,程序均输出数据到标准输出,重定向至文件。 ###Java v.s. Perl 同样的算法生成 data 文件, Java 的时间效率大约相当于 Perl 的2.5倍。 >在两位P粉的强烈抗议下,采用了一位P粉的代码, >速度比俺的数组实现提升了大约30倍。 换了发型,换了心情,回来再次测试发现P粉的提速说是扯的, 是 Ant 调用的问题,在终端里面运行 1m19s, 在 Ant 里面运行需要39min, 问题不知道出在啥地方。 鉴于俺原来优美的代码,还是决定换回去,顺便采纳P粉的一个建议: 用 foreach 替换 for 2013-10-20 17:33:00 : 测试了一下,Java 输出到 STDOUT 比输出到文件慢 5倍左右,Perl 前后无变化。所以在程序都直接输出到文件的情况下, Java 比 Perl 快10倍。 2013-10-21 22:47:37 : 我的机器上,Java 耗时6.3s,约为C的2倍, 但是我发现CPU占有率一直没超过 50%,多核的性能无法充分利用。 必须上多线程了 :) ,这次更新到了多线程版本, 耗时 3.7s ,CPU飚到了 99%,速度又提升了 25% 。 *使用多线程版本的时候又发现一个问题,在 Ant 中用 java task 运行程序的时候 会提前结束程序,甚至没有输出。而在终端运行, 或用 exec task 运行程序是正常的。* Java: `ant datagen` Perl: `perl DataGen.pl > data_perl` ##生成测试用数据 `ant prepare` 清理工作目录,重新生成所有测试用数据。 ##搜索算法1 使用 `StringBuilder` 的 `indexOf` 方法进行搜索。 ##搜索算法2 使用正则表达式 1. 将 `StringBuilder` 导出为字符串,使用 `String` 类的 `matches` 方法搜索。 1. 构造一个 `Pattern` 对象进行搜索,测试 `matches(String)` 方法效率 (是否每次匹配都需要重新编译参数)。