سؤال

النظر في وظيفة جافا سكريبت التالية (1):

function setData(domElement) {
  domElement.myDataProperty = {
    'suppose': 'this',
    'object': 'is',
    'static': 'and',
    'pretty': 'big'
  };
};

الآن ما لا أحبه في هذه الوظيفة هو أنه يتم إنشاء نفس الكائن بالضبط في كل مرة يتم فيها استدعاء الوظيفة. نظرا لأن الكائن لا يتغير، فأنا أفضل خلقها مرة واحدة فقط. لذلك يمكننا إجراء التعديلات التالية (2):

var dataObject = {
  'suppose': 'this',
  'object': 'is',
  'static': 'and',
  'pretty': 'big'
};

function setData(domElement) {
  domElement.myDataProperty = dataObject;
};

الآن يتم إنشاء الكائن مرة واحدة عند تحميل البرنامج النصي وتخزينه dataObject. وبعد ولكن دعونا نفترض ذلك setData يطلق عليه فقط أحيانا - معظم الأوقات التي يتم تحميل البرنامج النصي غير مستخدم. ما لا أحبه في هذه الوظيفة في هذه الحالة هو أن الكائن ينشئ دائما ويعقد في الذاكرة، بما في ذلك العديد من المناسبات التي لن يتم استخدامها قط. احسبت أنك يمكن أن تفعل شيئا مثل هذا لضرب الرصيد المثالي (3):

var dataObject;

function setData(domElement) {
  if (!dataObject) {
    dataObject = {
      'suppose': 'this',
      'object': 'is',
      'static': 'and',
      'pretty': 'big'
    };
  }
  domElement.myDataProperty = dataObject;
};

هل سيؤدي ذلك؟ أعتقد أنه يعتمد ذلك عندما يقرر المترجم إنشاء كائن. هل ينتظر حقا حتى يمر !dataObject الحالة، أو هل تدخل الوظيفة، يحاول أن تكون ذكية ويقرر بناءها مقدما؟ ربما تحتوي محركات JavaScript المختلفة على سياسات مختلفة فيما يتعلق بهذا؟

ثم بالطبع هناك سؤال حول ما إذا كانت هذه التحسينات ستظل في الممارسة العملية. من الواضح أن هذا يعتمد على عوامل مثل حجم الكائن، وسرعة المحرك، وكمية الموارد المتاحة، وما إلى ذلك، ولكن بشكل عام، أي واحد ستقول هو التحسين الأكثر أهمية: من (1) إلى (2) أو من (2) إلى (3)؟

هل كانت مفيدة؟

المحلول

الجواب هو أنه ليس من المفترض أن تعرفه. الأمثلة التي أظهرت لها اختلاف بسيط للغاية بينهما. الطريقة الوحيدة التي تقلقها بشكل معقول من أي وقت مضى بشأن هذا ما إذا كان لديك أدلة فعلية على أن إحدى الطرق أو آخر كانت تؤدي إلى إيذاء الأداء أو استخدام الذاكرة بشكل ملحوظ على مترجم معين. حتى ذلك الحين، إنه وظيفة المترجم يدعو للقلق بشأن تلك الأشياء بالنسبة لك.

ومع ذلك، إذا كنت تريد حقا معرفة ... جربها ومعرفة ذلك. اتصل بالإنسان المختلفة 1،000،000 مرة وشاهد الفرق الذي يجعله.

قم بإصدار إصدار عملاق من الكائن ومعرفة ما إذا كان هذا يجعل DUNT. مشاهدة مدير المهام. جرب متصفحات مختلفة. الإبلاغ عن نتائجك. إنها طريقة أفضل بكثير لمعرفة ذلك من مجرد طقم من الهزات على الإنترنت ما تخمينه قد يكون هو الحال.

ضع في اعتبارك أن هذا الكائن يجب أن يكون في الذاكرة على أي حال، بغض النظر النص المصدر

نصائح أخرى

يجب إنشاء كائن جديد - لا يمكن أن يكون، جزئيا لأن المواصة تتطلب ذلك، ولكن في الغالب لأن السلوك البدائل سيكون مضادا بديهيا، خذ:

function f() {
    return {a : "b", c: "d"};
}
o=f();
alert([o.c, o.e]); // Alerts "b,"
delete o.c;
o.e="f";
o=f();
alert([o.c, o.e]); // If the object was only created once this would produce ",f"

هل تتوقع حقا تعبير كائن جديد لا ينتج فعلا الكائن الذي تسأل عنه؟ لأن هذا ما يبدو أنه تريده.

لا يمكن تصورك فقط القيام به:

var myFunction = (function(){
    var object = {a: "b", c: "d"};
    return function() { return object; }
})();

والتي من شأنها أن تحصل على التأثير الذي تريده، على الرغم من أنك يجب أن تدرك أن الكائن الذي عودته هو كائن قابل للتغيير تماما يمكن تغييره، وسيكون الجميع يشاركون في نفس مثيل الطور.

أولا، أقوم بتنفيذه في الموقف رقم 2 وحمله مرة واحدة مباشرة بعد تحميل الصفحة.

إذا كانت هناك مشكلة في سرعة الصفحة، فسأقياس الوقت المستغرق بمهام محددة داخل الصفحة.

إذا كانت مكلفة للغاية لإنشاء الكائن (نسبيا)، فسوف أتحرك إلى الموقف رقم 3.

لا توجد نقطة في إضافة عبارة "إذا" إذا لم تشتري لك أي شيء ... وفي هذه الحالة، فإن إنشاء كائن بسيط / كبير ليس عرقا من ظهر وحدة المعالجة المركزية الخاصة بك. بدون قياسات، أنت لا تتحسن - أنت فقط تصوير أعمى.

إنها في الواقع طريقة شائعة إلى حد ما لتهيئة الأشياء التي استخدمتها شخصيا في C ++ وجافا.

أولا، هذا التحسين لن يهم أبدا في الممارسة العملية.

ثانيا، الوظيفة الأخيرة هي تماما جيدة مثل الوظيفة الأولى. حسنا، تقريبا. في الأول أفترض أنك تحت رحمة جامع القمامة، والتي يجب أن تدمر الكائن القديم عند إعادة تعيين domElement.myDataProperty. وبعد ومع ذلك، دون معرفة بالضبط كيف يعمل جامع القمامة على النظام الأساسي المستهدف (ويمكن أن يكون مختلفا تماما عبر المتصفحات)، لا يمكنك التأكد من أنك توفر أي عمل على الإطلاق حقا.

حاول كل ثلاثة منهم في اثنين من المتصفحات واكتشف أي أسرع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top