スポンサーリンク
※サイト運営にサーバーは必須です※
~ ロリポップ! はコスパのよい初心者向けサーバーです~
ショートサーキット評価(短絡評価)とは?
論理AND演算子と論理OR演算子は、右辺を評価する必要がなく、左辺のみ評価すればいい時があります。
A | B | A&&B |
false | 評価しない | false |
A | B | A||B |
true | 評価しない | true |
例えば、上のように、論理OR演算子で、左の式がtrueであれば、自動的に結果はtrueになります。
このように、評価する必要がない式の評価を省く評価の仕方をショートサーキット評価と呼ばれます。
※ショートサーキット評価は短絡評価と呼ばれることがあります。
ショートサーキット評価を行うには、&&(||)と二つ重ねて書く必要があります。
ソースコード
ショートサーキット評価をすることでどれだけ処理が早くなるか確認するためのコードです。
※&と|が一つの場合、ショートサーキット評価は行われません。
※言語はC#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Diagnostics;//追加(測定用) namespace operator20 { class Program { static void Main(string[] args) { bool t = true; bool f = false; bool[] d = new[] { f, f, f, f, t, t, t, t }; bool[] d0 = new[] { f, f, t, t, f, f, t, t }; bool[] d1 = new[] { f, t, f, t, f, t, f, t }; int count = 100000000; //ショートサーキット評価をしない場合 Stopwatch sw = new Stopwatch(); sw.Start();//測定開始 for (int j = 0; j < count; j++) { for (int i = 0; i < 8; i++) { bool a = d[i] & d0[i] & d1[i]; //bool a = d[i] & d0[i] | d1[i]; } } sw.Stop();//測定終了 //結果の表示 Console.Write("ショートサーキット評価をしない場合:"); Console.WriteLine(sw.Elapsed); sw = new Stopwatch(); sw.Start();//測定開始 //ショートサーキット評価をした場合 for (int j = 0; j < count; j++) { for (int i = 0; i < 8; i++) { bool b = d[i] && d0[i] && d1[i]; //bool b = d[i] && d0[i] || d1[i]; } } sw.Stop();//測定終了 //結果の表示 Console.Write("ショートサーキット評価をした場合:"); Console.WriteLine(sw.Elapsed); } } } |
ショートサーキット評価をしない場合:00:00:05.2397555
ショートサーキット評価をした場合:00:00:04.1017773
実行してみた感想としましては、&と|が複合した複雑な式では、ショートサーキット評価してもあまり速度が速くなった感じはしませんでした。一方で、比較的単純な式では、ショートサーキット評価をすることで実行速度は確実に早くなっています。
※コメントアウトしてある式のような式だと実行速度が速くなった感じはしなかったです。
関連記事
~ギャンブルに絶対儲かる必勝法があるのだろうか?~
私(サイト主)はこの疑問に対して非常に興味を持ち、プログラミングで検証してみました。
このサイトを応援してもいいかなと思う人はぜひとも購入を検討してみてください。