問題タブ [optimization]
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.
sql - テーブル スキャンとインデックスの追加 - どちらが速いですか?
何百万行ものテーブルがあります。特定の列値を持つすべての行を見つける必要があります。その列はインデックスにないため、テーブル スキャンが実行されます。
しかし、列を先頭に (主キーが続く) インデックスを追加し、クエリを実行してから、インデックスを削除する方が速いでしょうか?
ユーザーが探している列を指定しているため、インデックスを永続的に追加することはできません。
c++ - 末尾再帰の最適化を行う C++ コンパイラはどれですか?
C と C++ の両方で末尾再帰の最適化を行うと完全にうまくいくように思えますが、デバッグ中に、この最適化を示すフレーム スタックが表示されないようです。スタックが再帰の深さを教えてくれるので、これは良いことです。ただし、最適化も同様に優れています。
この最適化を行う C++ コンパイラはありますか? なんで?なぜだめですか?
コンパイラにそれを行うように指示するにはどうすればよいですか?
- MSVC の場合:
/O2
または/Ox
- GCC の場合:
-O2
または-O3
特定のケースでコンパイラがこれを行ったかどうかを確認するのはどうですか?
- MSVC の場合、PDB 出力を有効にしてコードをトレースできるようにしてから、コードを検査します。
- GCCの場合..?
特定の関数がコンパイラによってこのように最適化されているかどうかを判断する方法については、引き続き提案を行います(Konradがそれを想定するように指示してくれたので安心しましたが)
無限再帰を作成し、無限ループまたはスタック オーバーフローが発生するかどうかを確認することで、コンパイラがこれを行うかどうかを常に確認できます (GCC でこれを行い、それで-O2
十分であることがわかりました)。とにかく終了することがわかっている特定の機能を確認できます。これを簡単に確認する方法があれば幸いです:)
いくつかのテストの後、デストラクタがこの最適化を行う可能性を台無しにすることを発見しました。特定の変数と一時変数のスコープを変更して、return ステートメントが開始される前にそれらが確実にスコープ外になるようにすることは、価値がある場合があります。
末尾呼び出しの後にデストラクタを実行する必要がある場合、末尾呼び出しの最適化は実行できません。
sql-server - SQL Server-列の順序は重要ですか?
パフォーマンスと最適化の観点から:
- SQL Serverでテーブルを作成する場合、列をどのような順序で配置するかは重要ですか?
- 主キーが最初の列であるかどうかは重要ですか?
- マルチフィールドインデックスを作成する場合、列が隣接しているかどうかは重要ですか?
- ALTER TABLE構文を使用して、列を追加する位置を指定することはできますか?
- そうでない場合、どうすれば列を別の位置に移動できますか?
algorithm - 文字列内の特定の文字のインデックスを追跡するための最も効率的な方法は何ですか?
例として次の文字列を取り上げます。
「クイックブラウンフォックス」
現在、quickのqは文字列のインデックス4(0から開始)にあり、foxのfはインデックス16にあります。ここで、ユーザーがこの文字列にさらにテキストを入力するとします。
「非常に速いダークブラウンのキツネ」
ここで、qはインデックス9にあり、fはインデックス26にあります。
ユーザーが追加した文字数に関係なく、元のqのインデックスをquickで、fをfoxで追跡する最も効率的な方法は何ですか?
言語は私には関係ありません。これは何よりも理論上の質問なので、一般的に人気のある現在の言語を維持するために、必要な言語を使用してください。
私が提供したサンプル文字列は短いですが、任意のサイズの文字列を効率的に処理できる方法を望んでいます。したがって、オフセットを使用して配列を更新すると、短い文字列で機能しますが、多くの文字に行き詰まります。
この例では、文字列内の一意の文字のインデックスを探していましたが、茶色のoや狐のoなど、さまざまな場所で同じ文字のインデックスを追跡できるようにする必要もあります。したがって、検索は問題外です。
時間とメモリの両方で効率的な答えが得られることを望んでいましたが、1つだけを選択する必要がある場合は、パフォーマンスの速度を重視します。
sql - PostgreSQL パフォーマンス監視ツール
FreeBSD PostgreSQL バックエンドを使用して Web アプリケーションをセットアップしています。データベースのパフォーマンス最適化ツール/テクニックを探しています。
c# - ポインタ配列をメモリに固定する
私は現在、趣味のプロジェクトとしてC#のレイトレーサーに取り組んでいます。私はc++実装からいくつかのトリックを実装することによってまともなレンダリング速度を達成しようとしていますが、問題が発生しています。
レイトレーサーがレンダリングするシーン内のオブジェクトはKdTree構造に格納され、ツリーのノードは配列に格納されます。私が問題を抱えている最適化は、できるだけ多くのツリーノードをキャッシュラインに収めようとしているときです。これを行う1つの方法は、ノードに左側の子ノードへのポインターのみを含めることです。その場合、配列内の左側の子の直後に右側の子が続くことは暗黙的です。
ノードは構造体であり、ツリーの構築中に、静的メモリマネージャークラスによって配列に正常に配置されます。私が木を横断し始めると、最初はうまく機能しているように見えます。次に、レンダリングの初期の時点(毎回ほぼ同じ場所)で、ルートノードの左側の子ポインターが突然ヌルポインターを指しています。配列がヒープ上にあるため、ガベージコレクターが構造体を移動したという結論に達しました。
アドレスをメモリに固定するためにいくつかのことを試みましたが、必要に応じて、アプリケーションの存続期間全体にわたってそれらのどれも持続しないようです。'fixed'キーワードは、単一のメソッド呼び出し中にのみ役立つようであり、'fixed'配列の宣言は、ノードがそうではない単純な型でのみ実行できます。これを行うための良い方法はありますか、それともC#が意図されていなかったものの道をはるかに下っていますか?
ところで、c ++に変更することは、おそらく高性能プログラムにはより良い選択ですが、オプションではありません。
java - サードパーティのライブラリから綿毛を取り除くにはどうすればよいですか?
ベストプラクティスではないかもしれませんが、サードパーティのjarファイルから未使用のクラスを削除する方法はあります。私のクラスがライブラリを使用している方法を調べ、ある種のカバレッジ分析を行ってから、手つかずのクラスをすべて削除して別のjarファイルを吐き出します。
明らかにこれには問題があります。具体的には、私が言った使用シナリオでは、常にすべてのクラスを使用するとは限りません。
しかし、これらの問題を無視すると、原則としてそれを行うことができますか?
html - HTMLで1つの画像を別の画像の上に配置するにはどうすればよいですか?
私はRailsプログラミングの初心者で、ページに多くの画像を表示しようとしています。一部の画像は他の画像の上に配置されます。簡単にするために、青い正方形の右上隅に赤い正方形がある青い正方形が必要だとします(ただし、隅にはきつくありません)。パフォーマンスの問題のため、(ImageMagickなどを使用した)合成を回避しようとしています。
重なり合う画像を相互に相対的に配置したいだけです。
より難しい例として、より大きな画像の中に走行距離計を配置することを想像してください。6桁の場合、100万の異なる画像を合成するか、すべてをオンザフライで行う必要があります。必要なのは、6つの画像を他の画像の上に配置することだけです。
linq - LINQ to SQL クエリの最適化
次のようなクエリがあります。
注文とそれを作成したユーザーの情報を出力する必要があります。
これにより、注文を持ち込むための SQL クエリと、顧客を持ち込むための注文ごとに 1 つのクエリが生成されます。クエリを最適化して、注文と顧客を 1 つの SQL クエリで取得することはできますか?
ありがとう
UDPATE: sirrocco の提案により、クエリをこのように変更したところ、機能しました。1 つの選択クエリのみが生成されます。
sirocoさん、ありがとうございます。
python - なぜ SQL 集計関数は Python や Java (または Poor Man's OLAP) よりも非常に遅いのですか?
本当の DBA の意見が必要です。Postgres 8.3 は、私の Macbook Pro でこのクエリを実行するのに 200 ミリ秒かかりますが、Java と Python は 20 ミリ秒 (350,000 行) 未満で同じ計算を実行します。
SQL データベースを使用する場合、これは正常な動作ですか?
スキーマ (テーブルには調査への回答が保持されます):
コンテキストのために Java と Python でいくつかのテストを作成しましたが、それらは SQL をクラッシュさせます (純粋な python を除く):
sqlite3 でさえ、すべての列が文字列であると仮定しているにもかかわらず、Postgres と競合します (対照的に、Postgres で整数の代わりに数値列に切り替えるだけでも、10 倍の速度低下が発生します)。
成功せずに試したチューニングには次のものが含まれます(盲目的にいくつかのWebアドバイスに従います):
私の質問は、ここでの私の経験は正常ですか?これは、SQL データベースを使用するときに期待できることですか? ACID にコストがかかることは理解できますが、これはちょっとおかしいと思います。リアルタイムのゲーム速度を求めているわけではありませんが、Java は 20 ミリ秒未満で数百万の double を処理できるため、少しうらやましく思います。
シンプルな OLAP を低価格で (お金とサーバーの複雑さの両方の点で) 実行するより良い方法はありますか? 私は Mondrian と Pig + Hadoop を調べましたが、さらに別のサーバー アプリケーションを維持することにそれほど興奮しておらず、それらが役立つかどうかもわかりません。
いわば、Python コードと Java コードは社内ですべての作業を行っています。それぞれ 350,000 個のランダムな値を持つ 4 つの配列を生成し、平均を取ります。タイミングには世代を含めず、平均化ステップのみを含めます。Java スレッドのタイミングは 4 つのスレッド (配列あたり平均 1 つ) を使用し、やり過ぎですが、間違いなく最速です。
sqlite3 のタイミングは Python プログラムによって駆動され、ディスクから実行されます (:memory: ではありません)。
Postgres が舞台裏でさらに多くのことを行っていることは認識していますが、これは読み取り専用データであるため、その作業のほとんどは私にとって重要ではありません。
Postgres クエリは、その後の実行でタイミングを変更しません。
Python テストを再実行して、ディスクからスプールすることを含めました。タイミングは大幅に遅くなり、4 秒近くになります。しかし、Python のファイル処理コードはほとんど C で書かれていると思います (csv lib ではないかもしれませんが)。これは、Postgres がディスクからストリーミングしていないことを示しています (または、あなたが正しいので、お辞儀をする必要があります)。誰がストレージ層を書く前に!)