ผมทดสอบวิธีการที่มีแนวโน้มการใช้JMH รหัสมาตรฐานแบบเต็มรหัส
สมมติฐานในระหว่างการทดสอบ (เพื่อหลีกเลี่ยงการตรวจสอบกรณีมุมทุกครั้ง): ความยาวสตริงอินพุตจะมากกว่า 1 เสมอ
ผล
Benchmark Mode Cnt Score Error Units
MyBenchmark.test1 thrpt 20 10463220.493 ± 288805.068 ops/s
MyBenchmark.test2 thrpt 20 14730158.709 ± 530444.444 ops/s
MyBenchmark.test3 thrpt 20 16079551.751 ± 56884.357 ops/s
MyBenchmark.test4 thrpt 20 9762578.446 ± 584316.582 ops/s
MyBenchmark.test5 thrpt 20 6093216.066 ± 180062.872 ops/s
MyBenchmark.test6 thrpt 20 2104102.578 ± 18705.805 ops/s
คะแนนคือการดำเนินการต่อวินาทียิ่งดี
การทดสอบ
test1
เป็นแนวทางแรกของ Andy และ Hllink:
string = Character.toLowerCase(string.charAt(0)) + string.substring(1);
test2
เป็นแนวทางที่สองของ Andy นอกจากนี้ยังIntrospector.decapitalize()
แนะนำโดย Daniel แต่ไม่มีif
คำแถลงสองข้อ อันดับแรกif
ถูกลบออกเนื่องจากสมมติฐานการทดสอบ อันที่สองถูกลบออกเนื่องจากละเมิดความถูกต้อง (เช่นอินพุต"HI"
จะส่งคืน"HI"
) นี่เกือบจะเร็วที่สุด
char c[] = string.toCharArray();
c[0] = Character.toLowerCase(c[0]);
string = new String(c);
test3
เป็นการแก้ไขtest2
แต่แทนที่จะCharacter.toLowerCase()
เป็นฉันเพิ่ม 32 ซึ่งทำงานได้อย่างถูกต้องก็ต่อเมื่อสตริงอยู่ใน ASCII นี่เป็นวิธีที่เร็วที่สุด c[0] |= ' '
จากความคิดเห็นของไมค์ให้ประสิทธิภาพเดียวกัน
char c[] = string.toCharArray();
c[0] += 32;
string = new String(c);
test4
ใช้StringBuilder
แล้ว
StringBuilder sb = new StringBuilder(string);
sb.setCharAt(0, Character.toLowerCase(sb.charAt(0)));
string = sb.toString();
test5
ใช้สองsubstring()
สาย
string = string.substring(0, 1).toLowerCase() + string.substring(1);
test6
ใช้การสะท้อนเพื่อเปลี่ยนchar value[]
โดยตรงใน String นี่เป็นสิ่งที่ช้าที่สุด
try {
Field field = String.class.getDeclaredField("value");
field.setAccessible(true);
char[] value = (char[]) field.get(string);
value[0] = Character.toLowerCase(value[0]);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
ข้อสรุป
ถ้าความยาวเชือกอยู่เสมอมากกว่า 0 test2
การใช้งาน
ถ้าไม่เราต้องตรวจสอบกรณีมุม:
public static String decapitalize(String string) {
if (string == null || string.length() == 0) {
return string;
}
char c[] = string.toCharArray();
c[0] = Character.toLowerCase(c[0]);
return new String(c);
}
ถ้าคุณแน่ใจว่าข้อความของคุณจะเสมอใน ASCII test3
และคุณกำลังมองหาประสิทธิภาพมากเพราะคุณพบรหัสนี้ในคอขวดการใช้งาน