問題タブ [case-statement]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
5 に答える
9915 参照

delphi - CharInSetがCaseステートメントよりも高速なのはなぜですか?

困惑しています。今日のCodeRageで、Marco Cantuは、CharInSetが遅いので、代わりにCaseステートメントを試す必要があると述べました。パーサーでこれを行ってから、AQTimeでスピードアップを確認しました。Caseステートメントの方がはるかに遅いことがわかりました。

4,894,539の実行:

CharInSet(P ^、[''、#10、#13、#0])ではありませんがinc(P);を実行します。

0.25秒で計時されました。

しかし、同じ数の実行:

Trueは、     ''、#10、#13、#0の
  ケースP ^を実行します:ブレーク;     else inc(P);   終わり;


「whileTrue」の場合は.16秒、最初の場合は.80秒、その他の場合は.13秒かかり、合計で1.09秒、つまり4倍以上の長さになります。

CharInSetステートメントのアセンブラーコードは次のとおりです。

add edi、$ 02
mov edx、$ 0064b290
movzx eax、[edi]
call CharInSet
test a1、a1
jz $ 00649f18(addステートメントに戻る)

一方、ケースロジックは単純に次のとおりです。

movzx eax、[edi]
sub ax、$ 01
jb $ 00649ef0
sub ax、$ 09
jz $ 00649ef0
sub ax、$ 03
jz $ 00649ef0
add edi、$ 02
jmp $ 00649ed6(movzxステートメントに戻る)

ケースロジックは非常に効率的なアセンブラを使用しているように見えますが、CharInSetステートメントは実際にはSysUtilsにあり、次のような単純なCharInSet関数を呼び出す必要があります。

関数CharInSet(C:AnsiChar; const CharSet:TSysCharSet):ブール値;
結果の開始
:=CharSetのC;
終わり;

これが行われる唯一の理由は、[''、#10、#13、#0]のP ^がDelphi2009で許可されなくなったため、呼び出しが型の変換を行って許可するためだと思います。

それにもかかわらず、私はこれに非常に驚いており、それでも私の結果を信頼していません。

AQTimeは何か間違ったものを測定していますか、この比較で何かが欠けていますか、それともCharInSetは本当に使用する価値のある効率的な関数ですか?


結論:

バリー、わかったと思う。時間を割いて詳細な例を示していただきありがとうございます。私は自分のマシンでコードをテストし、.171、.066、および.052秒を取得しました(私のデスクトップはラップトップよりも少し速いと思います)。

そのコードをAQTimeでテストすると、3つのテストで0.79、1.57、1.46秒になります。そこでは、計装からの大きなオーバーヘッドを見ることができます。しかし、私が本当に驚いたのは、このオーバーヘッドによって、見かけの「最良の」結果が、実際には最悪のCharInSet関数に変わることです。

したがって、Marcuは正しく、CharInSetは低速です。しかし、あなたはうっかりして(または意図的に)、CharInSetがSetメソッドのAnsiChar(P ^)で何をしているのかを引き出すことによって私にもっと良い方法を与えてくれました。ケース方式に比べて速度がわずかに優れていることを除けば、ケースを使用するよりもコードが少なく、理解しやすいです。

また、AQTime(および他のインストルメンテーションプロファイラー)を使用した誤った最適化の可能性についても認識しました。これを知っていると、Delphi用のプロファイラーとメモリ分析ツールに関する私の決定に役立ちます。また、 AQTimeはどのようにそれを行うのかという私の質問に対する別の答えでもあります。。もちろん、AQTimeはインストルメント時にコードを変更しないため、他の魔法を使用して変更する必要があります。

したがって、答えは、AQTimeが誤った結論につながる結果を示しているということです。


フォローアップ:AQTimeの結果が誤解を招く可能性があるという「告発」をこの質問に残しました。しかし、公平を期すために、この質問を読むように指示する必要があります。Delphiの高速GetTokenルーチンはありますか?これは、AQTimeが誤解を招く結果をもたらすと考え始めたものであり、そうではないと結論付けています。

0 投票する
3 に答える
5525 参照

sql - SQL CASE ステートメント

SQL Server 2000 で次のことは可能ですか?

ありがとう。

0 投票する
3 に答える
514 参照

c# - C#で実行時に決定されるスイッチオーバー値

C#にcaseステートメントがあります。実行時に構成ファイルからケースの値を選択したいと思います。これは可能ですか?

0 投票する
1 に答える
746 参照

sql-server - OR を使用した where 句の case ステートメント

私はおそらくこれについて明らかな何かを忘れたり見逃したりしているように感じるので、前もってお詫び申し上げます。ここに行きます。WHERE 句で case ステートメントを使用しています。以下は正常に機能します。

私の「問題」は、追加の OR 句を ELSE ブロックに追加したいということです..次のようなものです:

当然、これは次のエラーをスローします: キーワード「OR」付近の構文が正しくありません。ELSEステートメント内

したがって、私の質問...これを達成するために使用できる正しい/代替ロジックは何ですか?
前もって感謝します

0 投票する
3 に答える
1210 参照

ruby-on-rails - If else または case ステートメントが役立ちます!

以下を達成するための最良の方法で、実際にいくつかの助けを借りることができます: 私はコントローラーに以下を持っています (そして、これはここにあってはならず、モデルに移動する必要があることを知っています)

これは電子メール メッセージング システムです。そのため、あなたが保持しているポジションに応じて、設定されたグループに電子メールを送信できます。したがって、大隊司令官などの場合は、以下に定義されている 5 つのグループのいずれかにメッセージを送信することを選択できます。あなたが中隊長である場合、あなたのグループは変更されます。ビューにはドロップダウン メニューがあり、メッセージの送信先グループを選択します。サインインしているユーザーの位置に応じて、選択メニューが表示されます。

問題は、「elsif」部分がメッセージに正しく入力されていないようです。右のドロップダウン リストが表示され、電子メールが送信されたが、電子メールが入力されていないかのように動作します。ただし、最初の値 (大隊司令官) は正常に機能します。

if else ステートメントに何か間違った記述がありますか? それはかなり単純であるべきだと思われます。ユーザーの位置は常に正しく反映されるため、そうではありません。

したがって、これは機能しません。一方のセットの位置または他方のセットのいずれかで機能しますが、両方では機能しません。これは、ビュー内の選択メニューに関連しており、特定のグループの人々に対するクエリを保持する位置に応じて変化します。

だから私はこれを持っています:

私はまだレールを学んでおり、case ステートメントの方が良いかどうかはわかりませんが、それがどこに行き、その case ステートメントがビューにどのように適合するかについて混乱しています。

どんなガイダンスでも素晴らしいでしょう。私はこれを少しずつ取り除いて理解しようとしていますが、助けていただければ幸いです。

0 投票する
2 に答える
669 参照

sql - TSQL - 1 つの case ステートメントで 2 つの値を返す方法は?

CASE1 つのステートメントを使用して 2 つの異なる値を返す方法はありますか?

次のクエリにはCASE、同じ条件の 2 つのステートメントがあります。

とにかく、そのCASEステートメントを一度指定することはありますか? 条件が変わるたびに両方のステートメントを同期
させる必要がないようにするには?CASE

0 投票する
3 に答える
2303 参照

oracle - IF内の複数のSelectステートメント

レポートのprog./sqlコンストラクトを作成するためにいくつかのヘルプを使用できます。

SQLは、最初にプロンプ​​トをチェックしてから、実行する「select」ステートメントを決定する必要があります

(擬似コード)のようなもの

上記はうまくいかないようです。助けてください!

0 投票する
4 に答える
16122 参照

sql - Progress DB SQL の LIKE 演算子

私は進行中のSQLでこのようなことをしようとしています(これはPOSTGRESではありません!)

ただし、Progress は LIKE 演算子をサポートしていません。INSTRそれは仕事をするかもしれないように見えますが、それはプログレス拡張機能であり、私が使用しているDBではサポートされていません. 標準の ODBC 関数を使用してこれを達成する別の方法はありますか?

ありがとう

0 投票する
3 に答える
8096 参照

sql-server - SQL Case ステートメントが失敗することはありますか?

C# の case ステートメントのように、SQL で CASE ステートメントを失敗させる方法はありますか? 私がやりたくないのは以下の例ですが、それが私の唯一の選択肢である場合は、それを使用すると思います。

例:

編集:

SQL Server を使用しています。

0 投票する
8 に答える
1191 参照

delphi - Delphiのキーワードのリストでキーワードをチェックする最も速い方法は何ですか?

キーワードのリストがあります。私が本当にやりたいことは、次のようなものです。

残念ながら、CASEステートメントは文字列のように使用することはできません。

ストレートのIFTHENELSE IF構文を使用できます。例:

しかし、これは比較的非効率的だと聞きました。

代わりに私がやっていたことは次のとおりです。

もちろん、これは最良のプログラミングスタイルではありませんが、私にとっては問題なく機能し、これまでのところ違いはありませんでした。

では、これをDelphiで書き直して、シンプルでわかりやすく、しかも高速にするための最良の方法は何でしょうか。

(参考までに、Unicode文字列でDelphi 2009を使用しています。)


ファローアップ:

Tobyは、IfThenElse構文を使用することをお勧めします。CASEステートメントを使用した私の例を振り返ると、それがどのように実行可能な答えであるかがわかります。残念ながら、CASEを含めると、私の本当の質問がうっかり隠されてしまいました。

私は実際にそれがどのキーワードであるかを気にしません。特定のメソッドがPOSメソッドと同じように識別できる場合、これは単なるボーナスです。私が必要としているのは、キーワードがキーワードのセットに含まれているかどうかを知ることです。

だから本当に私はより良いものがあるかどうか知りたいです:

この場合、IfThenElseに相当するものは良くないようです。

Kornelの質問に対するBarryのコメントの中で、彼はTDictionaryGenericに言及しています。私はまだ新しいジェネリックコレクションを取り上げていません。それらを掘り下げる必要があるようです。ここでの私の質問は、それらが効率のために構築されているかどうか、そしてTDictionaryを使用すると、外観と速度が上記の2つの行とどのように比較されるかということです。


後のプロファイリングで、('' + MyKeyword +'')のような文字列の連結は時間的に非常にコストがかかるため、可能な限り避ける必要があることがわかりました。他のほとんどの解決策は、これを行うよりも優れています。