যদিও সর্বোচ্চ আপোভোট করা উত্তর একেবারে সেরা উত্তর জাভা 8, এটি একই সময়ে পারফরম্যান্সের দিক থেকে একেবারে খারাপ। আপনি যদি সত্যিই খারাপ লো পারফরম্যান্ট অ্যাপ্লিকেশন চান, তবে এগিয়ে যান এবং এটি ব্যবহার করুন। ব্যক্তির নামগুলির একটি অনন্য সেট আহরণের সহজ প্রয়োজনীয়তা কেবলমাত্র "প্রতিটি-জন্য" এবং একটি "সেট" দ্বারা অর্জন করা হবে। তালিকা 10 এর আকারের উপরে থাকলে জিনিসগুলি আরও খারাপ হয়।
আপনার 20 টি অবজেক্টের সংগ্রহ রয়েছে তা বিবেচনা করুন:
public static final List<SimpleEvent> testList = Arrays.asList(
new SimpleEvent("Tom"), new SimpleEvent("Dick"),new SimpleEvent("Harry"),new SimpleEvent("Tom"),
new SimpleEvent("Dick"),new SimpleEvent("Huckle"),new SimpleEvent("Berry"),new SimpleEvent("Tom"),
new SimpleEvent("Dick"),new SimpleEvent("Moses"),new SimpleEvent("Chiku"),new SimpleEvent("Cherry"),
new SimpleEvent("Roses"),new SimpleEvent("Moses"),new SimpleEvent("Chiku"),new SimpleEvent("gotya"),
new SimpleEvent("Gotye"),new SimpleEvent("Nibble"),new SimpleEvent("Berry"),new SimpleEvent("Jibble"));
আপনি আপত্তি যেখানে SimpleEvent
এই মত দেখাচ্ছে:
public class SimpleEvent {
private String name;
private String type;
public SimpleEvent(String name) {
this.name = name;
this.type = "type_"+name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
এবং পরীক্ষা করার জন্য আপনার কাছে জেএমএইচ কোড রয়েছে, (দয়া করে নোট করুন, আমি স্বীকৃত উত্তরে উল্লিখিত একই স্বতন্ত্রবাইকি প্রিডিকেট ব্যবহার করছি ):
@Benchmark
@OutputTimeUnit(TimeUnit.SECONDS)
public void aStreamBasedUniqueSet(Blackhole blackhole) throws Exception{
Set<String> uniqueNames = testList
.stream()
.filter(distinctByKey(SimpleEvent::getName))
.map(SimpleEvent::getName)
.collect(Collectors.toSet());
blackhole.consume(uniqueNames);
}
@Benchmark
@OutputTimeUnit(TimeUnit.SECONDS)
public void aForEachBasedUniqueSet(Blackhole blackhole) throws Exception{
Set<String> uniqueNames = new HashSet<>();
for (SimpleEvent event : testList) {
uniqueNames.add(event.getName());
}
blackhole.consume(uniqueNames);
}
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(MyBenchmark.class.getSimpleName())
.forks(1)
.mode(Mode.Throughput)
.warmupBatchSize(3)
.warmupIterations(3)
.measurementIterations(3)
.build();
new Runner(opt).run();
}
তারপরে আপনার বেঞ্চমার্কের ফলাফলগুলি এরকম হবে:
Benchmark Mode Samples Score Score error Units
c.s.MyBenchmark.aForEachBasedUniqueSet thrpt 3 2635199.952 1663320.718 ops/s
c.s.MyBenchmark.aStreamBasedUniqueSet thrpt 3 729134.695 895825.697 ops/s
এবং আপনি দেখতে পাচ্ছেন, জাভা 8 স্ট্রিমের তুলনায় একটি সরল ফর-ফ্রি হ'ল থ্রুপুটটিতে 3 গুণ ভাল এবং ত্রুটি স্কোরের চেয়ে কম।
উচ্চ থ্রুপুট, ভাল পারফরম্যান্স
Function<? super T, ?>
, এমন নয়Function<? super T, Object>
। এছাড়াও এটি লক্ষ করা উচিত যে অর্ডার করা সমান্তরাল প্রবাহের জন্য এই দ্রবণটি কোন বস্তুটি বের করা হবে (সাধারণের বিপরীতেdistinct()
) গ্যারান্টি দেয় না । সিক্যুয়াল স্ট্রিমগুলির জন্য সিএইচএম ব্যবহার করার জন্য অতিরিক্ত ওভারহেড রয়েছে (যা @ নোসিড সলিউশনে অনুপস্থিত)। পরিশেষে এই সমাধানটিfilter
পদ্ধতির চুক্তিকে লঙ্ঘন করে যা জাভাডকের বর্ণিত হিসাবে পূর্বাভাস অবশ্যই রাজ্যহীন হতে হবে। তবুও upvated।