私の質問を完全に定義する前に、>>この質問/回答<<は私の問題に答えないということを言わなければなりません、そして私は与えられた答えがプロパティ対の実際の効果とまったく一致しないことを自分自身に証明しました。変数またはキャッシュされたプロパティ(以下を参照)。
私はHTML5キャンバスを使用しており、640x480の領域に生のピクセルブロックを1秒間に何度も書き込みます。
.data
いくつかのチュートリアルでアドバイスされているように、変数のプロパティをキャッシュすることをお勧めしImageData
ます(この場合はそうなります _SCimgData
)。
そのプロパティをにキャッシュすると 、Canvasで問題なく繰り返しSC_IMG_DATA
使用でき ます。putImageData
しかし、を使用して直接アクセスを繰り返すと _ScimgData.data
、コードの速度低下が顕著になります(単一の640x480キャンバスを埋めるのに約1秒かかります)。
var SomeCanvas = document.getElementById("SomeCanvas");
var SCContext = SomeCanvas.getContext("2d");
var _SCimgData = SomeCanvas.getImageData(0, 0, 640, 400);
var SC_IMG_DATA = _SCimgData.data;
今、私は次の疑問を持っています:
私のコードは他の種類の同様のアクセスに対しても同じくらい遅いでしょうか?
オブジェクトのいくつかの「インスタンス」(通常のユーティリティ関数によって作成される)を持つことができ、オブジェクトの配列内のインスタンスのインデックスを作成/初期化する必要がある一連の関数のオブジェクトの配列が必要です、またはそのプロパティを更新します。
私の具体的な例はこれです:
var objArray=new Array();
var objArray[0]=new Object();
objArray[0].property1="some string property";
for(var x=0; x<65536; x++)
doSomething(objArray[0].property1, objIDX=0);
setInterval
一部のプロパティに含まれるプロパティと関数が非常に集中的に呼び出された場合(もちろん、ブラウザのロックを回避するために複数の「タイマースレッド」を使用して、1ミリ秒で数回)、そのコードはCanvasの場合と同じくらい遅くなりますか?
もしそうなら、メインオブジェクト配列内のいくつかのオブジェクトのさまざまなプロパティへのアクセスを高速化するために他にどのような選択肢がありますか?
編集1(2012-08-27)
提案をありがとう。私が取り組んでいるプロジェクトに役立つと思うので、私はそれらに賛成票を投じました。
私はメソッドの組み合わせを考えています。主にArray
sの代わりにObject
sを使用して「ベースオブジェクト」の実際の配列を作成し、arr[0]
文字列配列キー()の代わりに数字()で配列要素をアドレス指定しますarr["zero"]
。
var OBJECTS_SIZE=10
var Obj_Instances=new Array();
Obj_Instances[0]="property or array 1 of Object 0";
Obj_Instances[1]=new Array();
Obj_Instances[1][0]=new ArrayBuffer(128);
Obj_Instances[1][1]=new DataView(Obj_Instances[1][0]);
Obj_Instances[2]="property or array 3 of Object 0";
Obj_Instances[3]=function(){alert("some function here")};
Obj_Instances[4]="property or array 5 of Object 0";
Obj_Instances[5]="property or array 6 of Object 0";
Obj_Instances[6]=3;
Obj_Instances[7]="property or array 8 of Object 0";
Obj_Instances[8]="property or array 9 of Object 0";
Obj_Instances[9]="property or array 10 of Object 0";
Obj_Instances[10]="property or array 1 of Object 1";
Obj_Instances[11]=new Array();
Obj_Instances[11][0]=new ArrayBuffer(128);
Obj_Instances[11][1]=new DataView(Obj_Instances[11][0]);
Obj_Instances[12]="property or array 3 of Object 1";
Obj_Instances[13]=function(){alert("some function there")};
Obj_Instances[14]="property or array 5 of Object 1";
Obj_Instances[15]="property or array 6 of Object 1";
Obj_Instances[16]=3;
Obj_Instances[17]="property or array 8 of Object 1";
Obj_Instances[18]="property or array 9 of Object 1";
Obj_Instances[19]="property or array 10 of Object 1";
function do_Something_To_Property_Number_6(objIdx)
{
//Fix the index to locate the base address
//of the object instance:
///
objIdx=(objIdx*OBJECTS_SIZE);
Obj_instances[objIdx+6]++; //Point to "Property" 6 of that object
}
たとえば、最初の10個の配列要素を占める「オブジェクト」の「インスタンス」があります。次の「インスタンス」は次の10個の配列要素を取り、以下同様に続きます(カスタム「コンストラクター」関数で初期化を作成して、配列要素の新しいブロックを追加します)。
また、jsPerfとJSHintを使用して、どちらの組み合わせがより良い結果になるかを確認します。