研究はjavaと.netのHashSetの対比だけです
27094 ワード
皆さん、私は戦争を起こしているわけではありません.私はただ本当のことを知りたいだけです.私はコードから、C#とjavaの2つのバージョンの機能を実現する必要があります.この対比を発見しました.問題の本質を議論して、どうしてこのような問題が発生しますか.JAvaもC#も優秀です.皆さん、過激にならないでください.
今日、仕事の問題でC#とjavaが同意したコード機能の実行状況をテストして、問題を発見しました.
HashSet.containsメソッドと比較すると、javaの下ではc#の性能が高くない.
[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ミリ秒以上で、約.
[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#の実行結果を見てみましょう
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万回の検索挿入状況を見てみましょう
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秒の様子.
これはレベル級の性能の問題ではありませんか???
次に見て、直接挿入、.、挿入にも検索条件が付いているので
[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秒余りで、
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の生成方式で、完全なコードがそっくりであることを保証します.
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秒である
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秒です
今日、仕事の問題で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秒です