0

私は惨めで、誰かが助けてくれることを願っています!

非常に遅いコードがありました。私は 40 を持っていvariablesます。それぞれについて、次のことを行います。

for (i=variables.length; i--;) {
  metric = URL?name=variable;
  d3.select( ... get_data(metric)).... // calls to visualize the data 
}

function get_data(metric) { 
  d3.json(metric, function(data) {
     // do stuff 
  }); 
}

高速化するために、次のことを行いました。

for (i=variables.length; i--;) {
  metric = URL;
  d3.select( ... get_data(metric,variable)).... // calls to visualize the data
} 

function get_data(metric,variable) { 
  d3.json(metric, function(data) {
    parse(data, variable) // extract variable related data
    // do stuff 
  }); 
}

新しいコードは少なくとも 6 倍高速です。しかし、なぜ?より多くのデータをフェッチしていませんか?

編集:私は戻っconsole.log(data)て新しいget_data機能を実行しましたが、驚くべきことに、データ全体(URL)を40回要求しました!! それでも、これは 40 の異なる (URL?name=variable) を実行するよりも高速です。

4

1 に答える 1

1

変数を URL に追加することはもうないので、URL は一定のままです。ブラウザは最初のリクエストの後にレスポンスをキャッシュすると思うので、残りの 39 件のリクエストはキャッシュから提供されます。

つまり、HTTP リクエストの数が減り、接続の確立にかかる時間が短縮されます。

「最善の」解決策は、合計で 1 つの Ajax リクエストのみを作成することです。

var get_data = (function() {
  var cache = {};

  function doStuff(data, variable) {
    parse(data, variable);
    // do stuff
  }

  return function(metric, variable) {
    if (cache[metric]) {
      doStuff(cache[metric], variable);
    }
    else {
      d3.json(metric, function(data) {
        cache[metric] = data;
        doStuff(data, variable);
      }); 
    }
  };
}());
于 2013-08-26T20:42:24.903 に答える