6

そこで、プロトタイプを使用するとどれだけ速くなるかを確認するために、これらのテストを作成しました...

function User() {
    return {
        name: "Dave",
        setName: function(n) {
            this.name = n;
        },
        getName: function() {
            return this.name;
        }
    };
}

function UserPrototype() {
    if (!(this instanceof UserPrototype)) return new UserPrototype();
    this.name = "Dave";
}
UserPrototype.prototype.getName = function() {
    return this.name;
};
UserPrototype.prototype.setName = function(n) {
    this.name = n;
};

function setName(obj,name)
{
    obj.name = name;
}
function getName(obj)
{
    return obj.name;
}

//Test 1
var c = 10000000;
var tstart = 0;
var tend = 0;
tstart = new Date().getTime();
for (var j = 0; j < c; j++) {
    var newUser = User();
    newUser.setName("michael");
    newUser.getName();
}
tend = new Date().getTime() - tstart;
console.log("Returning object with methods: " + tend / 1000.0 + " seconds");
//Test 2
tstart = new Date().getTime();
for (var j = 0; j < c; j++) {
    var newUser = new UserPrototype();
    newUser.setName("michael");
    newUser.getName();
}
tend = new Date().getTime() - tstart;
console.log("Using prototypes: " + tend / 1000.0 + " seconds");
//Test 3
tstart = new Date().getTime();
for (var j = 0; j < c; j++) {
    var newUser = {name:"dave"};
    setName(newUser,"michael");
    getName(newUser);
}
tend = new Date().getTime() - tstart;
console.log("Using general functions: " + tend / 1000.0 + " seconds");
​

私の結果:

Returning object with methods: 9.075 seconds
Using prototypes: 0.149 seconds 
Using general functions: 0.099 seconds 

最初の 2 つのテストを作成し、結果を見たとき、なぜそれらが表示されているのかを考えました...その理由は、毎回 2 つの新しいメソッド プロパティ インスタンスが作成されるという事実のために、オブジェクトの戻りが遅いためだと考えています。オブジェクトはインスタンス化されますが、プロトタイプ メソッドは関数を 1 回作成するだけなので高速です。一般的な関数呼び出しとプロトタイプの間のパフォーマンスの近さは、私の仮定が正しいと思わせてくれます。

だから私の最初の質問は、私の仮定は正しいですか?

2 つ目の質問は、高パフォーマンスを維持しながら、プロトタイプを使用してより読みやすくするにはどうすればよいかということです。「クラス」にあるように見える方法でプロトタイプをコーディングする方法はありますか (それが理にかなっている場合)

*編集 - Object.create() でテストを行うのを忘れていました。1 つだけ実行して結果を投稿しました。JSFiddle: ( http://jsfiddle.net/k2xl/SLVLx/ )。

私は今得ます:

Returning object with methods: 0.135 seconds fiddle.jshell.net:63
Using prototypes: 0.003 seconds fiddle.jshell.net:72
Using general functions: 0.002 seconds fiddle.jshell.net:81
Returning object.create version: 0.024 seconds 

これが解決策のように見えますか?

4

2 に答える 2

3

私はあなたの仮定に同意します。これは、コードが次のように記述されている場合にも発生します。

function UserObject() {
    this.name = "Dave";

    this.getName = function() {
        return this.name;
    };
    this.setName = function(n) {
        this.name = n;
    };
}

この場合、「オブジェクト」メソッドと同様に、オブジェクトが構築されるたびにメソッドgetNameとメソッドが作成されます。setNameUserObject

「prototypes」メソッドと「functions」メソッドのコードにはわずかな違いがあります。削除するif (!(this instanceof UserPrototype)) return new UserPrototype();(これは不必要なセーフ ガードです) と、かなり削られます。間違いなく、より近い比較...

var newUser = new UserPrototype();
[newUser].name = "Dave";

... は ...

var newUser = new Object();
newUser.name = "dave";

... なぜなら ...

var newUser = {name:"dave"};

Object... を作成してプロパティを追加するときは、ネイティブ コードを高く評価しnameます。

その場合、結果は反転し、「プロトタイプ」メソッドの方が速くなります。ここで jsFiddle を参照してください。

プロトタイプを読みやすくする方法については、私にはどうすることもできません。私にとって、それらは読みやすいです:-)

于 2012-09-02T18:21:52.660 に答える
0

コンストラクター内で this 値を使用していない場合は、コンストラクター内では絶対に使用せず、プロトタイプとして使用してください。例えば

UserPrototype.prototype.name = "デイブ";

それを行うと、プロトタイプがスピードで勝ちます。

于 2014-05-16T16:59:03.220 に答える