研究はjavaと.netのHashSetの対比だけです

27094 ワード

皆さん、私は戦争を起こしているわけではありません.私はただ本当のことを知りたいだけです.私はコードから、C#とjavaの2つのバージョンの機能を実現する必要があります.この対比を発見しました.問題の本質を議論して、どうしてこのような問題が発生しますか.JAvaもC#も優秀です.皆さん、過激にならないでください.
 
今日、仕事の問題でC#とjavaが同意したコード機能の実行状況をテストして、問題を発見しました.
HashSet.containsメソッドと比較すると、javaの下ではc#の性能が高くない.
 1     private static final Logger log = Logger.getLogger(NewClass.class);
 2 
 3     public static void main(String[] args) {
 4         for (int j = 0; j < 5; j++) {
 5             HashSet<Integer> ids = new HashSet<>(0);
 6             log.error("    :" + j);
 7             int forCount = 200 * 10000;
 8             for (int i = 0; i < forCount; i++) {
 9                 if (!ids.contains(i)) {
10                     ids.add(i);
11                 }
12             }
13             log.error("    :" + j + "     :" + forCount);
14         }
15     }

 
[04-12 16:57:427]->テスト開始:0[04-12 16:58:063]->テスト終了:0実行回数:200000[04-12 16:16:58:064]->テスト開始:1[04-12 16:58:835]->テスト終了:1実行回数:200000[04-12 16:16:58:835]->テスト開始:2[04-12 16:16:58:993]->テスト終了:2実行回数:200000[04-12 16:58:994]->テスト開始:3[04-12 16:59:247]->テスト終了:3実行回数:200000[04-12 16:59:249]->テスト開始:4[04-12 16:59:348]->テスト終了:4実行回数:200000
 
Javaの実行結果は200万回の検索挿入を実行し、実行時間は100ミリ秒以上で、約.
 1     private static final Logger log = Logger.getLogger(NewClass.class);
 2 
 3     public static void main(String[] args) {
 4         for (int j = 0; j < 5; j++) {
 5             HashSet<Integer> ids = new HashSet<>(0);
 6             log.error("    :" + j);
 7             int forCount = 2000 * 10000;
 8             for (int i = 0; i < forCount; i++) {
 9                 if (!ids.contains(i)) {
10                     ids.add(i);
11                 }
12             }
13             log.error("    :" + j + "     :" + forCount);
14         }
15     }

 
[04-12 16:18:09:345]->テスト開始:0[04-12 16:18:24:835]->テスト終了:0実行回数:2000000[04-12 16:18:24:836]->テスト開始:1[04-12 16:18:36:600]->テスト終了:1実行回数:2000000[04-12 16:18:36:600]->テスト開始:2[04-12 16:18:44:331]->テスト終了:2実行回数:2000000[04-12 16:44:331]->テスト開始:3[04-12 16:18:51:801]->テスト終了:3実行回数:2000000[04-12 16:18:51:803]->テスト開始:4[04-12 16:19:01:277]->テスト終了:4実行回数:2000000
 
2000が検索挿入を完了したときの実行平均時間は約9秒程度です
 
次にc#の実行結果を見てみましょう
 
 1     static void Main(string[] args)
 2         {
 3             for (int j = 0; j < 5; j++)
 4             {
 5                 HashSet<int> ids = new HashSet<int>();
 6                 Console.WriteLine(DateTime.Now.NowString() + "" + j);
 7                 int forCount = 200 * 10000;
 8                 for (int i = 0; i < forCount; i++)
 9                 {
10                     if (!ids.Contains(i))
11                     {
12                         ids.Add(i);
13                     }
14                 }
15                 Console.WriteLine(DateTime.Now.NowString() + "" + j + "" + forCount);
16             }
17             Console.ReadLine();
18         }

 
2015-04-12 16:20:06:23:開始テスト:020115-04-12 16:20:06:321:終了テスト:0実行回数:200000002015-04-12 16:20:06:322:開始テスト:12015-04-12 16:20:06:413:終了テスト:1実行回数:200000002015-04-12 16:20:06:414:開始テスト:22015-04-12試験開始:32015-04-12 16:20:06:616:試験終了:3実行回数:20000005-04-12 16:20:06:617:試験開始:420115-04-12 16:20:06:717:試験終了:4実行回数:200000
200万回の検索挿入を実行し、平均時間は100ミリ秒程度でjavaよりやや勝っている. 
 
2000万回の検索挿入状況を見てみましょう
 1         static void Main(string[] args)
 2         {
 3             for (int j = 0; j < 5; j++)
 4             {
 5                 HashSet<int> ids = new HashSet<int>();
 6                 Console.WriteLine(DateTime.Now.NowString() + "" + j);
 7                 int forCount = 2000 * 10000;
 8                 for (int i = 0; i < forCount; i++)
 9                 {
10                     if (!ids.Contains(i))
11                     {
12                         ids.Add(i);
13                     }
14                 }
15                 Console.WriteLine(DateTime.Now.NowString() + "" + j + "" + forCount);
16             }
17             Console.ReadLine();
18         }

 
2015-04-12 16:20:51:746:試験開始:02015-04-12 16:20:52:633:試験終了:0実行回数:2000000 2015-04-12 16:20:52:634:試験開始:12015-04-12 16:20:53:645:試験終了:1実行回数:2000000 2015-04-12 16:53:645:試験開始:22015-04-12 16:54:615:試験終了:2実行回数:2000000 2015-04-12 16:54:615:試験開始:32015-04-12 16:20:55:623:試験終了:3実行回数:2000000 2015-04-12 16:20:55:624:試験開始:420115-04-12 16:20:56:561:試験終了:4実行回数:2000000
2000万回の検索挿入時間を見ると約1秒の様子.
これはレベル級の性能の問題ではありませんか???
 
次に見て、直接挿入、.、挿入にも検索条件が付いているので
 1    private static final Logger log = Logger.getLogger(NewClass.class);
 2 
 3     public static void main(String[] args) {
 4         for (int j = 0; j < 5; j++) {
 5             HashSet<Integer> ids = new HashSet<>(0);
 6             log.error("    :" + j);
 7             int forCount = 2000 * 10000;
 8             for (int i = 0; i < forCount; i++) {
 9                 ids.add(i);
10             }
11             log.error("    :" + j + "     :" + forCount);
12         }
13     }

 
[04-12 16:30:32:591]->テスト開始:0[04-12 16:30:44:725]->テスト終了:0実行回数:2000000[04-12 16:30:44:726]->テスト開始:1[04-12 16:30:57:535]->テスト終了:1実行回数:2000000[04-12 16:30:57:536]->テスト開始:2[04-12 16:31:37]->テスト終了:2実行回数:2000000[04-12 16:31:08:237]->テスト開始:3[04-12 16:31:19:306]->テスト終了:3実行回数:2000000[04-12 16:31:19:309]->テスト開始:4[04-12 16:31:23:810]->テスト終了:4実行回数:2000000
単純にjavaを挿入して2000万回実行する時間は約9秒余りで、
 
 1   static void Main(string[] args)
 2         {
 3             for (int j = 0; j < 5; j++)
 4             {
 5                 HashSet<int> ids = new HashSet<int>();
 6                 Console.WriteLine(DateTime.Now.NowString() + "" + j);
 7                 int forCount = 2000 * 10000;
 8                 for (int i = 0; i < forCount; i++)
 9                 {
10                         ids.Add(i);
11                 }
12                 Console.WriteLine(DateTime.Now.NowString() + "" + j + "" + forCount);
13             }
14             Console.ReadLine();
15         }

 
2015-04-12 16:32:35:355:テスト開始:02015-04-12 16:32:36:064:テスト終了:0実行回数:2000000 2015-04-12 16:32:36:065:テスト開始:12015-04-12 16:32:36:879:テスト終了:1実行回数:2000000 2015-04-12 16:32:36:879:テスト開始:22015-04-12 16:32:37:657:テスト終了:2実行回数:2000000 2015-04-12 16:32:37:657:試験開始:32015-04-12 16:32:38:466:試験終了:3実行回数:2000000 2015-04-12 16:32:38:467:試験開始:420115-04-12 16:32:39:238:試験終了:4実行回数:2000000
 
c#2000万回挿入実行時間は約1秒足らず.あ、おもしろいかな...
私のパソコンの問題なのか、それとも私の実行状況が間違っているのか分かりません.皆さんがアドバイスしてください.の
 
 
======================================================================
ここでは、視聴者の皆さんの要求に応じてstringに変更し、guidの生成方式で、完全なコードがそっくりであることを保証します.
 
 
 1  static void Main(string[] args)
 2         {
 3             Console.ReadLine();
 4             for (int j = 0; j < 5; j++)
 5             {
 6                 serverID = j;
 7                 id = 0;
 8                 HashSet<String> ids = new HashSet<String>();
 9                 Console.WriteLine(DateTime.Now.NowString() + "" + j);
10                 int forCount = 600 * 10000;
11                 for (int i = 0; i < forCount; i++)
12                 {
13                     //long tempID = getId();
14                     String tempID = Guid.NewGuid().ToString();
15                     bool add = ids.Add(tempID);
16                     if (!add)
17                     {
18                         Console.WriteLine(DateTime.Now.NowString() + "" + i + "  " + tempID);
19                     }
20                 }
21                 Console.WriteLine(DateTime.Now.NowString() + "" + j + "" + forCount);
22             }
23             Console.ReadLine();
24         }

 
2015-04-12 18:17:501:試験開始:02015-04-12 18:29:757:試験終了:0実行回数:6000002015-04-12 18:29:757:試験開始:12015-04-12 18:17:39:582:試験終了:1実行回数:6000002015-04-12 18:17:39:583:試験開始:22015-04-12 18:17:48:41:試験終了:2実行回数:60000020115-04-12 18:48:41:試験開始:32015-04-12 18:17:56:255:試験終了:3実行回数:6000002015-04-12 18:17:56:試験開始:42015-04-12 18:18:04:374:試験終了:4実行回数:6000000
 
実行挿入600の完了実行時間は約9秒である
 1  private static final SimpleDateFormat DF2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS: ");
 2 
 3     public static String getDateFormat1() {
 4         return DF2.format(new Date());
 5     }
 6 
 7     public static void main(String[] args) throws Exception {
 8         for (int j = 0; j < 5; j++) {
 9             serverID = j;
10             id = 0;
11             HashSet<String> ids = new HashSet<>(0);
12             System.out.println(getDateFormat1() + "    :" + j);
13             int forCount = 600 * 10000;
14             for (int i = 0; i < forCount; i++) {
15                 //long tempid = getId();
16                 String tempid = UUID.randomUUID().toString();
17                 boolean add = ids.add(tempid);
18                 if (!add) {
19                     System.out.println(getDateFormat1() + "  : " + i + "    " + tempid);
20                 }
21             }
22             System.out.println(getDateFormat1() + "     :" + j + "     :" + forCount);
23         }
24     }

 
2015-04-12 18:19:34:589:試験開始:02015-04-12 18:19:49:246:試験終了:0実行回数:6000002015-04-12 18:19:49:246:試験開始:12015-04-12 18:20:00:516:試験終了:1実行回数:6000002015-04-12 18:20:00:516:試験開始:22015-04-12 18:20:10:670:試験終了:2実行回数:60000020115-04-12 18:10:670:試験開始試験:32015-04-12 18:20:20:40 1:試験終了:3実行回数:6000002015-04-12 18:20:40 1試験開始:42015-04-12 18:20:31:124:試験終了:4実行回数:6000000
同じ600が完成するのは約11秒です