問題タブ [tradeoff]
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.
c++ - インライン コードを使用する必要があるのはなぜですか?
私は C/C++ 開発者ですが、いつも困惑する質問がいくつかあります。
- 「通常の」コードとインライン コードに大きな違いはありますか?
- 主な違いはどれですか?
- インライン コードは単なるマクロの「形式」ですか?
- コードをインライン化する場合、どのようなトレードオフを行う必要がありますか?
ありがとう
memory-management - 適切なメモリ プロファイルを構成するものは何ですか?
デスクトップ アプリケーションを設計する際に、アプリケーションが使用するメモリの量に関する一般的なルールはありますか?
負荷の高いアプリケーションの場合、Firefox や Google Chrome のように簡単に理解できるか、少なくともプロファイリングできます。しかし、小規模なユーティリティや基幹業務アプリケーションの場合、許容できるメモリ使用量はどれくらいでしょうか?
最近、メモリ使用量とパフォーマンスのトレードオフに出くわしたので質問しましたが、それに関して一般的なコンセンサスがあるかどうか疑問に思っていますか?
編集:プラットフォームは、リッチ インターネット アプリケーションを実行できるマシンを使用するユーザー向けの Windows XP です。
私の特定のトレードオフの問題は、メモリに大量の画像をキャッシュすることです。可能であれば、ユーザーのメモリが許す限りアプリをキャッシュしたいと思っています。現時点でのメモリ負荷を考慮して、アプリケーションが特定の最大制限までキャッシュするようにしました。.
しかし、良い数字は何でしょう?どうやって思いつきますか?それが私が尋ねているポイントです。
unix - System V と Posix セマフォの違い
System V と Posix セマフォの使用のトレードオフは何ですか?
language-agnostic - 知っておくべきパラメーターを暗黙的に渡すことは、カプセル化に違反しませんか?
テスト駆動開発の関係者から、暗黙のうちに大量の情報を取得する関数を持つことは悪いことだとよく耳にします。テストの観点からこれが悪いことはわかりますが、カプセル化の観点からは必要な場合があるのではないでしょうか? 次の質問が頭に浮かびます。
Random と OrderBy を使用するのは良いシャッフル アルゴリズムですか?
基本的に、誰かが C# で配列をランダムにシャッフルする関数を作成したいと考えていました。何人かの人々は、乱数ジェネレーターをパラメーターとして渡す必要があると彼に言いました。これは、テストが容易になるとしても、カプセル化のひどい違反のように思えます。配列シャッフル アルゴリズムがシャッフルしている配列以外の状態を必要とするという事実は、呼び出し元が気にする必要のない実装の詳細ではないでしょうか? この情報を取得する正しい場所は、暗黙のうちに、おそらくスレッドローカル シングルトンからではないでしょうか?
database - データベースの代替案?
データベースを使用することのトレードオフと、他のオプションは何であるか疑問に思いました。また、データベースに適していない問題は何ですか?
私はリレーショナルデータベースに関心があります。
sql-server - 更新が遅い vs 選択が遅い
トレードオフについての質問です。
ソーシャルネットワークを想像してみてください。各ユーザーにはステータス メッセージがあり、いつでも変更できます。彼がそれを変更するときはいつでも、彼のすべての友人は壁を通して通知されます (Facebook のように)。
これを機能させるには。Users(id, name)、FriendLists(userId、friendUserId)、Notifications(?) の 3 つのテーブルがあります。
ここで、各ユーザーのフレンド リストに約 50 人のフレンドがいるとします。私はジレンマに直面しています - 通知テーブルを実装する方法。
最初のオプション
通知を送信:
この場合、ステータスの変更ごとに 50 のレコードを作成します (50 人の友人を想定)。これは悪いです。ただし、良い点は、toUserId にクラスター化されたインデックスがあるため、特定のユーザーの通知を取得するのが非常に高速であることです。
2番目のオプション
通知を送信:
ここでは、ステータス更新ごとに 1 つのレコードのみを挿入します。これはいい。悪い点は、toUserId によってレコードがクラスター化されていないため、通知の取得が遅くなることです。
通知の取得は、両方の方法で同じです。
それで、あなたはこれについてどう思いますか?
algorithm - 時空間のトレードオフを使用する最短経路アルゴリズム?
問題: 重み付けされていない無向グラフで最短経路を見つける。
幅優先探索は 2 つのノード間の最短経路を見つけることができますが、これには最大で O(|V| + |E|) の時間がかかる場合があります。事前に計算されたルックアップ テーブルを使用すると、O(1) 時間でリクエストに応答できますが、O(|V|^2) スペースが犠牲になります。
私が疑問に思っていること:よりきめの細かい時空トレードオフを提供するアルゴリズムはありますか? 言い換えれば、次のようなアルゴリズムはありますか?
- O(1) よりも長い時間で最短経路を見つけますが、双方向の幅優先検索よりも高速です
- O(|V|^2) より少ないスペースを占有する事前計算されたデータを使用しますか?
実用面:グラフは 800,000 ノードであり、スモールワールド ネットワークであると考えられています。すべてのペアの最短パス テーブルはギガバイトのオーダーになります。これは最近では法外なことではありませんが、私たちの要件には合いません。
しかし、私は好奇心から質問しています。夜、私を悩ませているのは、「どうすれば全ペア ルックアップ テーブルのキャッシュ ミスを減らすことができるか?」ではなく、「聞いたことのないまったく異なるアルゴリズムが世の中にあるのだろうか?」ということです。
答えはノーかもしれませんが、それは問題ありません。
uikit - CCUIViewWrapper と移植された機能を使用することの長所と短所
Cocos2d で CCUIViewWrapper を使用することと、移植された機能を使用することの長所と短所を理解しようとしています。たとえば、CCUIViewWrapper で UITableView を使用するか、CCTableViewSuite を使用する方がよいでしょうか。一見すると、おそらくUITableViewが提供するすべてのことを実行できるため、ラッパーの方が優れたアプローチであると思いますが、欠けている重要な詳細はありますか? Apple SDK オブジェクトを実際に使用したり、CCTableView などの移植されたオブジェクトに付属する Cocos2d 内の特定の機能を利用できないなど、ラッパーに深刻な制限がありますか?
c++ - すべてをインラインでマークしてみませんか?
まず、コンパイラにすべての関数の実装をインライン化させる方法を探していません。
inline
誤った回答のレベルを減らすには、キーワードが実際に何を意味するのかを理解してください。これが良い説明です。インラインvs静的vs外部です。
だから私の質問、なぜすべての関数定義をマークしないのinline
ですか?つまり、理想的には、唯一のコンパイル単位はですmain.cpp
。または、ヘッダーファイルで定義できない関数(pimplイディオムなど)については、さらにいくつかの可能性があります。
この奇妙な要求の背後にある理論は、オプティマイザーに最大の情報を提供するというものです。もちろん、関数の実装をインライン化することもできますが、モジュールが1つしかないため、「クロスモジュール」最適化を行うこともできます。他に利点はありますか?
誰かが実際のアプリケーションでこれを試しましたか?パフォーマンスは向上しましたか?下降?!?
すべての関数定義をマークすることの欠点は何inline
ですか?
- コンパイルは遅くなる可能性があり、はるかに多くのメモリを消費します。
- 反復ビルドが壊れているため、変更するたびにアプリケーション全体を再ビルドする必要があります。
- リンク時間は天文学的なものかもしれません
これらの欠点はすべて、開発者にのみ影響します。実行時の欠点は何ですか?
language-agnostic - オンザフライパーサー/生成前の空間/時間のトレードオフに関する考慮事項
オンザフライパーサーを使用することのスペース関連の利点は、事前に生成されたルックアップテーブルの時間関連の利点を上回りますか?
ロングバージョン:
私は化学参照ツールを作成しており、特定のパターンに準拠する数式に自動的に名前を付ける機能が含まれています。例C[n]H[2n+2] => [n]ane
; ここ[n]
で、はLHSの整数です。RHS上の名前の配列へのインデックス。(meth
、、eth
…)
私が見る限り、これは2つの方法のいずれかで実装できます。
formula <=> name
ペアのキー/値デュアルルックアップディクショナリを事前に生成します。アプリケーションの起動時(起動が遅い)、またはアプリケーションとともに公開される静的リスト(ダウンロードが遅い)。数式は、カスタムビルドのパーサーによってその場で評価されます。
アプローチ1では、name =>式のルックアップは、桁違いに単純になります。ただし、ジェネレーターは、アプリケーションで数十メガバイトのデータを出荷する場合を除いて、の値を事前設定し、かなり低くする必要がありますn
。
これをさらに複雑にするのは、数式がいくつかの項を持つことができるという事実です。などC[n]H[2n+1]OC[n']H[2n'+1]
; そして、これらのそれぞれについて、可能な一致の数は、幾何学的に増加しn
ます。さらに、このアプローチを使用すると、誰のビジネスのようにRAMを消費します。
アプローチ2では、かなり小さいルックアップテーブルを使用するかなり大きな値をサポートできますn
が、name=>式のルックアップはやや複雑になります。アプリケーションと一緒に出荷するための事前生成ファイルと比較すると、新しいデータファイルを出荷しなくても、生成ロジックのエラーを修正できます。
これには、各式をいくつかのルールの大まかなテストと照合して、適合するかどうかを判断する必要もあります。ルールがたくさんある場合は、時間がかかり、インターフェイスの速度が著しく低下する可能性があります。
したがって、問題は次のとおりです。
私が説明できなかったトレードオフ、または私が考慮しなかったアプローチに考慮事項はありますか?
オンザフライパーサーを使用する利点は、実装の複雑さの増大を正当化するのでしょうか?