- コンピュータオセロ総合スレッド
962 :名無し名人[]:2014/10/30(木) 01:05:37.96 ID:ERiENK+1 - >>958
>最終一手のところではof2を使ってるけど、omではof2ではなくofを使うように変えてある >sh1のところもofでやるようにしてもほとんど変らないはず そうですか。 >>951に書いた自分の仮説(of2が速度差の原因)は棄却されましたね。 つまり、自分のプログラムと比べて>>907がof2により劇的に高速化しているのではなく、 自分のプログラムがどこかでヘマをしていると考えた方が良さそうです。
|
- コンピュータオセロ総合スレッド
963 :名無し名人[]:2014/10/30(木) 01:35:52.88 ID:ERiENK+1 - >>959
調査していただいたようでありがとうございます。 movablePositionsとorderの部分に時間がかかっているということで、 まずはプリミティブな処理であるorderの部分を自分でも調べてみました。 >>960はEnumerable.Rangeを使ったものと使わないものの比較で、 ループ処理の速度と配列の生成の速度を調べたものになります。 自分の環境でのリリースビルドでの実行結果は以下になりました。 673 31 1317 168 とんでもない違いw ループ処理で20倍、配列生成で10倍ほど違いますね。 C#勉強し始めてEnumerable.Rangeはすっきり書けて便利だな〜 と思って使ってたんですが、何回も呼ばれるメソッドで利用するのは 避けた方が良さそうです。 この辺が可読性と高速性のトレードオフというか、 プログラマが意識して選択しなければならないところですね。 int[] array4 = new int[n]; for (int i = 0; i < n; i++) { array4[i] = i; } よりも int[] array3 = Enumerable.Range(0, n).ToArray(); の方が可読性は高いが高速性は低いということで。 少量しか呼ばれないところはそのまま残して(可読性重視) 多量に呼ばれるところ、少なくとも1億回呼ばれる探索メソッドでは 高速性重視でこれから変更しようと思います。
|
- コンピュータオセロ総合スレッド
964 :名無し名人[]:2014/10/30(木) 01:37:21.98 ID:ERiENK+1 - int n = 100000000;
Stopwatch sw1 = new Stopwatch(); Stopwatch sw2 = new Stopwatch(); Stopwatch sw3 = new Stopwatch(); Stopwatch sw4 = new Stopwatch(); sw1.Start(); IEnumerable<int> order = Enumerable.Range(0, n); foreach (int i in order) { } sw1.Stop(); Console.WriteLine(sw1.ElapsedMilliseconds); sw2.Start(); for (int i = 0; i < n; i++) { } sw2.Stop(); Console.WriteLine(sw2.ElapsedMilliseconds); sw3.Start(); int[] array3 = Enumerable.Range(0, n).ToArray(); sw3.Stop(); Console.WriteLine(sw3.ElapsedMilliseconds); sw4.Start(); int[] array4 = new int[n]; for (int i = 0; i < n; i++) { array4[i] = i; } sw4.Stop(); Console.WriteLine(sw4.ElapsedMilliseconds);
|
- コンピュータオセロ総合スレッド
965 :名無し名人[]:2014/10/30(木) 01:59:29.00 ID:ERiENK+1 - 次に、movablePositionsについてです。
>Listを止めてint[]にするだけでかなり速度改善すると思われます。 これについてはC#のListは通常のリストではないんですね。 配列は参照がO(1)で編集がO(n) リストは参照がO(n)で編集がO(1) ですが、C#のリストは配列をベースにしているようなんです。 なので、最初に確保する領域を適切に設定すれば Listもint[]もほとんど変わらないと思います。 でも、movablePositionsが重いというのは事実なわけで、 なんとかしたいわけなんですが、そもそもこの movablePositions(着手可能位置)を返すようなメソッドって みなさんは用意してるんですかね? ちょっと思ったのが、 少なくとも探索時にはアルファベータでカットが発生することを考えると、 最初にmovablePositionsを用意しておくんじゃなくて、 次の着手可能位置はどこ?と言われたときに初めて計算する、 という風にした方がいいのかなぁと・・・。
|