পারফরম্যান্স-ভিত্তিক parseInt
এবং এগুলি অন্যান্য সমাধানগুলির চেয়ে আরও খারাপ, কারণ কমপক্ষে ব্যতিক্রম হ্যান্ডলিংয়ের প্রয়োজন।
আমি জেএমএইচ টেস্ট চালিয়েছি এবং দেখেছি charAt
স্ট্রিংয়ের উপরে পুনরাবৃত্তি হ'ল স্ট্রিংয়ের মধ্যে কেবলমাত্র সংখ্যা রয়েছে কিনা তা পরীক্ষা করার দ্রুততম উপায় ary
জেএমএইচ টেস্টিং
পরীক্ষাগুলি Character.isDigit
বনাম Pattern.matcher().matches
বনাম Long.parseLong
বনাম পরীক্ষার চরিত্রের মানগুলির তুলনা করে ।
এই উপায়গুলি অ-এসিআই স্ট্রিং এবং স্ট্রিংগুলিতে +/- চিহ্নগুলি সহ বিভিন্ন ফলাফল তৈরি করতে পারে।
5 টি ওয়ার্মআপ পুনরাবৃত্তি এবং 5 টি পরীক্ষা পুনরাবৃত্তি সহ টেস্টগুলি থ্রুপুট মোডে ( আরও ভাল better
ফলাফল
মনে রাখবেন যে প্রথম পরীক্ষার লোডের parseLong
চেয়ে প্রায় 100 গুণ ধীর isDigit
।
## Test load with 25% valid strings (75% strings contain non-digit symbols)
Benchmark Mode Cnt Score Error Units
testIsDigit thrpt 5 9.275 ± 2.348 ops/s
testPattern thrpt 5 2.135 ± 0.697 ops/s
testParseLong thrpt 5 0.166 ± 0.021 ops/s
## Test load with 50% valid strings (50% strings contain non-digit symbols)
Benchmark Mode Cnt Score Error Units
testCharBetween thrpt 5 16.773 ± 0.401 ops/s
testCharAtIsDigit thrpt 5 8.917 ± 0.767 ops/s
testCharArrayIsDigit thrpt 5 6.553 ± 0.425 ops/s
testPattern thrpt 5 1.287 ± 0.057 ops/s
testIntStreamCodes thrpt 5 0.966 ± 0.051 ops/s
testParseLong thrpt 5 0.174 ± 0.013 ops/s
testParseInt thrpt 5 0.078 ± 0.001 ops/s
পরীক্ষা স্যুট
@State(Scope.Benchmark)
public class StringIsNumberBenchmark {
private static final long CYCLES = 1_000_000L;
private static final String[] STRINGS = {"12345678901","98765432177","58745896328","35741596328", "123456789a1", "1a345678901", "1234567890 "};
private static final Pattern PATTERN = Pattern.compile("\\d+");
@Benchmark
public void testPattern() {
for (int i = 0; i < CYCLES; i++) {
for (String s : STRINGS) {
boolean b = false;
b = PATTERN.matcher(s).matches();
}
}
}
@Benchmark
public void testParseLong() {
for (int i = 0; i < CYCLES; i++) {
for (String s : STRINGS) {
boolean b = false;
try {
Long.parseLong(s);
b = true;
} catch (NumberFormatException e) {
// no-op
}
}
}
}
@Benchmark
public void testCharArrayIsDigit() {
for (int i = 0; i < CYCLES; i++) {
for (String s : STRINGS) {
boolean b = false;
for (char c : s.toCharArray()) {
b = Character.isDigit(c);
if (!b) {
break;
}
}
}
}
}
@Benchmark
public void testCharAtIsDigit() {
for (int i = 0; i < CYCLES; i++) {
for (String s : STRINGS) {
boolean b = false;
for (int j = 0; j < s.length(); j++) {
b = Character.isDigit(s.charAt(j));
if (!b) {
break;
}
}
}
}
}
@Benchmark
public void testIntStreamCodes() {
for (int i = 0; i < CYCLES; i++) {
for (String s : STRINGS) {
boolean b = false;
b = s.chars().allMatch(c -> c > 47 && c < 58);
}
}
}
@Benchmark
public void testCharBetween() {
for (int i = 0; i < CYCLES; i++) {
for (String s : STRINGS) {
boolean b = false;
for (int j = 0; j < s.length(); j++) {
char charr = s.charAt(j);
b = '0' <= charr && charr <= '9';
if (!b) {
break;
}
}
}
}
}
}
23 ফেব্রুয়ারী, 2018 আপডেট হয়েছে
- আরও দুটি কেস যুক্ত করুন - একটি
charAt
অতিরিক্ত অ্যারে তৈরির পরিবর্তে এবং অন্যটি IntStream
চর কোড ব্যবহার করে
- লুপযুক্ত পরীক্ষার ক্ষেত্রে অ-অঙ্ক পাওয়া গেলে অবিলম্বে বিরতি যুক্ত করুন
- লুপযুক্ত পরীক্ষার ক্ষেত্রে খালি স্ট্রিংয়ের জন্য মিথ্যা ফিরিয়ে দিন
23 ফেব্রুয়ারী, 2018 আপডেট হয়েছে
- আরও একটি পরীক্ষার কেস যুক্ত করুন (দ্রুত!) যা স্ট্রিমটি ব্যবহার না করে চরের মানের সাথে তুলনা করে
matches("\\d{2,}")
বা একটিPattern
এবংMatcher