我尝试使用字符“X”屏蔽信用卡号字符串中的字符。我编写了如下两个函数。第二个函数使用 commons.lang.StringUtils
类。我试图找到在这两种情况下花费的时间
public static String maskCCNumber(String ccnum){
long starttime = System.currentTimeMillis();
int total = ccnum.length();
int startlen=4,endlen = 4;
int masklen = total-(startlen + endlen) ;
StringBuffer maskedbuf = new StringBuffer(ccnum.substring(0,startlen));
for(int i=0;i<masklen;i++) {
maskedbuf.append('X');
}
maskedbuf.append(ccnum.substring(startlen+masklen, total));
String masked = maskedbuf.toString();
long endtime = System.currentTimeMillis();
System.out.println("maskCCNumber:="+masked+" of :"+masked.length()+" size");
System.out.println("using StringBuffer="+ (endtime-starttime)+" millis");
return masked;
}
public static String maskCCNumberCommons(String ccnum){
long starttime = System.currentTimeMillis();
int total = ccnum.length();
int startlen=4,endlen = 4;
int masklen = total-(startlen + endlen) ;
String start = ccnum.substring(0,startlen);
String end = ccnum.substring(startlen+masklen, total);
String padded = StringUtils.rightPad(start, startlen+masklen,'X');
String masked = padded.concat(end);
long endtime = System.currentTimeMillis();
System.out.println("maskCCNumber:="+masked+" of :"+masked.length()+" size");
System.out.println("using Stringutils="+(endtime-starttime)+" millis");
return masked;
}
public static void ccNumberMaskingDemo() {
String mcard1="5555555555554444";
maskCCNumber(mcard1);
maskCCNumberCommons(mcard1);
}
当我运行这个时,我得到了这个结果
maskCCNumber:=5555XXXXXXXX4444 of :16 size
using StringBuffer=0 millis
maskCCNumber:=5555XXXXXXXX4444 of :16 size
using Stringutils=25 millis
我不明白为什么 commons.StringUtils 比第一个函数中的 for loop+StringBuffer 花费更多的时间。显然我使用的是 api,错误的方式..
在这种情况下,有人可以建议如何正确使用这个 api 吗?
原文由 jimgardener 发布,翻译遵循 CC BY-SA 4.0 许可协议
首先,如果您对这样一个短时间运行的代码进行测量,由于您的 CPU/库/任何提供的最小时间分辨率(这意味着您通常会看到 0ms 或相同的小值),您通常不会得到准确的结果超过)。
其次,更重要的是,不要优化它! “过早的优化是万恶之源” ,如果你只有几毫秒的时间想要优化,那么你的努力就彻底白费了。在您甚至应该远程考虑优化这种简单的屏蔽方法之前,您将不得不屏蔽数百万张信用卡。