【发布时间】:2013-12-05 02:13:18
【问题描述】:
我正在开发一个计算两个字符串(A 和 B)之间的命中百分比的程序。为了获得准确的百分比,我将 N-Grams 与作为字符串 A 排列的字符串列表进行匹配。
这是我的代码
public String[] generatePermutations( String name ){
String[] perms = new String[ calcN(name.length()) ];
int nameLen = name.length(),
cnt = 0;
for(int i = 0; i < name.length(); i++ ){
nameLen = name.length()-i;
for( int ii = 0; ii <= i; ii++){
perms[cnt++] = name.substring( ii, ii + nameLen );
}
}
return perms;
}
参考calcN()在下面
public int calcN( int n ){
return ( n * (n+1 )) / 2;
}
给定一个字符串“ABC”,此方法将生成
{“A”、“B”、“C”、“AB”、“BC”、“ABC”}
由于我执行此操作数千次(可能是数十万次),有什么办法可以从 CPU 中挤出几个额外的周期? (除了切换到 C++ 或 C)。一如既往,提前感谢您的建议!
【问题讨论】:
-
这个问题似乎是题外话,因为它是关于代码改进而不是代码修复。此类问题请访问CodeReview。
-
需要指出的是substring在不同jvm中的实现方式不同。有些使用作为原始字符串基础的单个不变数组,有些则将数组复制到新字符串中。
-
有没有办法找出哪个是哪个,或者强制 JVM 使用一个?我在 3.5ghz i7-4770K 上运行 Win7,64 位
-
@Kyte
java -version会告诉你正在运行哪一个(版本和构建)。如果它没有说 OpenJDK,那它就不是 OpenJDK。您可以从openjdk.java.net 下载 OpenJDK JVM
标签: java string optimization permutation n-gram