3

このシナリオ例を見てみましょう:

出力を計算するために数学的な平方根と立方根 (処理が遅い) を含む非常に複雑な関数存在します。例として、関数が 2 つのパラメーターabを受け入れ、両方の値 a と b の入力範囲が明確に定義されていると仮定します。入力値abの範囲が 0 から 100 であると仮定します。

したがって、基本的にfn(a,b)はリアルタイムで計算するか、その結果をデータベースに事前に入力して、必要に応じてフェッチすることができます。

方法 1:リアルタイムで計算する

function fn(a,b){

result = compute_using_cuberoots(a,b)

return result
}

方法 2:データベースから関数の結果を取得する

対応する結果にマッピングされた入力値が事前に入力されたデータベースがあります。

a   |  b  | result
0   |  0  |   12.4
1   |  0  |   14.8
2   |  0  |   18.6
.   |  .  |    .
.   |  .  |    .
100 | 100 |  1230.1

そして、私たちはできる

function fn(a,b){

result = fetch_from_db(a,b)

return result
}

私の質問:

あなたはどの方法を支持しますか、またその理由は何ですか? ある方法が他の方法よりも効率的である理由は何だと思いますか?

これは、私たちのほとんどがプログラミング生活のある時点で直面するシナリオであり、したがってこの質問だと思います。

ありがとうございました。

質問の背景(関係ないかもしれません)

例 :画像処理のようなシナリオでは、入力 (R、G、B) の値の範囲が既知 (0 ~ 255) で、平方根とキューブルートは、サーバー要求が完了するまでに時間がかかりすぎます。

Instagram のようなアプリを構築している例を考えてみましょう。ユーザーがサーバーに送信した画像を処理するのにかかる時間と、処理された画像を返すのにかかる時間は、最適なユーザー エクスペリエンスのために最小限に抑える必要があります。このような状況では、画像の処理にかかる時間を最小限に抑えることが重要です。さらに悪いことに、このような処理要求の数が大きくなると、スケーラビリティの問題が発生します。

したがって、このような状況で最適な方法でもある上記の方法のいずれかを選択する必要があります。

私の状況の詳細(必要な場合):

フレームワーク: Ruby on Rails、データベース: MongodB

4

5 に答える 5

3

私はどちらの方法も推奨しません。両方をテストして (どちらも妥当だと思った場合)、データを取得します。

それを書いたので、私は餌に立ち向かいます: 計算と I/OI の相対的な速度を考えると、計算はデータベースから関数値を取得するよりも高速であると予想されます。いくつかの特殊なケースでは、メモリ内データベースが (再) 計算よりも優れたパフォーマンスを発揮できる可能性があることは認めますが (それ以上のことはありません)、一般的なルールとしてはありません。

于 2012-03-02T11:00:43.307 に答える
2

「より効率的」というのはあいまいな用語です。「より速い」はより具体的です。

SQL データベース テーブル内の数百万行について話している場合は、結果を計算するよりも 1 行を選択する方が高速である可能性があります。コモディティ ハードウェアでは、調整されていないサーバーを使用すると、通常、数ミリ秒で数百万行のインデックス付きテーブルから 1 行を返すことができます。しかし、この 1 つの目的のためだけに dbms サーバーをインストールしてデータベースを構築する前に、よく考えてみてください。

「より速い」という言葉をもう少し具体的にするために、ユーザーエクスペリエンスについて話しているとき、特定の制限内では、実際の速度は見かけの速度よりも重要ではありません. 適切なタイミングで適切な種類のフィードバックがあれば、人々は物事が速く進んでいるように感じたり、少なくとも少し待っていても大したことではないと感じたりします。その方法の詳細については、Stack Exchange ネットワークのユーザー エクスペリエンスを参照してください。

良い点は、両方の方法をテストするのが非常に簡単であることです。この特定の問題だけを速度テストするには、データベースに正しい値を保存する必要さえありません。適切なキーとインデックスが必要なだけです。正しい値を計算するのに 1 日かかる場合は、それを検討します。

おそらく、長期間にわたってテストする必要があります。dbms からの速度の変動が増えると思います。ただし、どの程度のバリエーションを期待すべきかはわかりません。

于 2012-03-02T11:57:25.713 に答える
2

入力が固定値の場合は、結果の計算とテーブルからの読み取りが適切な解決策になる可能性があります。リアルタイムで計算し、結果を最適な時間キャッシュすることは、入力がさまざまな状況で変化する場合に適したソリューションです。

「私たちは小さな効率を忘れるべきです。たとえば、約 97% の確率で: 時期尚早の最適化はすべての悪の根源です」Donald Knuth

于 2012-03-02T11:22:38.370 に答える
0

計算と保存の組み合わせとしてハッシュを使用することを検討します。彼は本当に複雑な関数で表されa**bます:

lazy = Hash.new{|h,(a,b)|h[[a,b]] = a**b}
lazy[[4,4]]
p lazy #=> {[4, 4]=>256}
于 2012-03-02T13:16:17.297 に答える
0

コード自体に値を保存することを考えます:

class MyCalc
  RESULTS = [
    [12.4, 14.8, 18.6, ...]
    ...
    [..., 1230.1]
  ]
  def self.fn a, b
    RESULTS[a][b]
  end
end

MyCalc.fn(0,1)         #=> 14.8
于 2012-03-02T13:37:51.493 に答える