আমি জেএমএইচ ব্যবহার করে প্রতিশ্রুতিবদ্ধ পদ্ধতির পরীক্ষা করেছি । পূর্ণ মাপদণ্ডের কোড ।
পরীক্ষাগুলির সময় অনুমান (প্রতিবার কোণার কেসগুলি পরীক্ষা করা এড়াতে): ইনপুট স্ট্রিংয়ের দৈর্ঘ্য সর্বদা 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
প্রথম অ্যান্ডির এবং হিলিংকের পন্থা ছিল:
string = Character.toLowerCase(string.charAt(0)) + string.substring(1);
test2
দ্বিতীয় অ্যান্ডির পদ্ধতির ছিল। এটি Introspector.decapitalize()
ড্যানিয়েল দ্বারাও প্রস্তাবিত, তবে দুটি 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[]
সরাসরি পরিবর্তন করতে প্রতিবিম্ব ব্যবহার করে । এটি সবচেয়ে ধীর ছিল।
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
।