ব্রাউজারগুলি কি প্রতিটি পৃষ্ঠা লোডে জাভাস্ক্রিপ্ট পার্স করে?


190

ব্রাউজারগুলি (IE এবং ফায়ারফক্স) লিঙ্কিত জাভাস্ক্রিপ্ট ফাইলগুলি প্রতিবার পৃষ্ঠা রিফ্রেশ করার সময় পার্স করে?

তারা ফাইলগুলি ক্যাশে করতে পারে, তাই আমি অনুমান করছি যে তারা প্রতিবার এগুলি ডাউনলোড করার চেষ্টা করবে না, তবে প্রতিটি পৃষ্ঠা মূলত পৃথক হওয়ায় আমি প্রত্যাশা করছি যে কোনও পুরানো কোড ছিন্ন করে পুনরায় পার্স করবে।

এটি অকার্যকর, যদিও পুরোপুরি বোধগম্য, তবে আমি আশ্চর্য হয়েছি যে আধুনিক ব্রাউজারগুলি সাইটের মধ্যে পার্সিং পদক্ষেপ এড়াতে যথেষ্ট চালাক কিনা। আমি এমন জায়গাগুলির কথা ভাবছি যেখানে কোনও সাইট জাভাস্ক্রিপ্ট লাইব্রেরি ব্যবহার করে যেমন এক্সটজেএস বা জিকুয়েরি ইত্যাদি uses


4
আমার 2 সি: আমি মনে করি পার্সেড জাভাস্ক্রিপ্ট ফাইলগুলি ক্যাশে করার পারফরম্যান্স সুবিধাগুলি এটি একটি অর্থবহ অপ্টিমাইজেশন হতে পারে না small
Itay Maman

2
আমার মানদণ্ড থেকে, এটি আসলে গুরুত্বপূর্ণ হতে পারে। উদাহরণস্বরূপ jQuery লোড সময় প্রায় 30msecs (একটি দ্রুত ডেস্কটপ মেশিনে) এর মধ্যে, যার মধ্যে 20% কেবল কোডটিকে একটি কার্যকর কার্যকর উপস্থাপনায় পার্স করছে এবং বাকীগুলি এটি চালাচ্ছে, অর্থাত্ এই ক্ষেত্রে jQuery অবজেক্টটি আরম্ভ করা হবে। আপনি যদি মোবাইলে থাকেন এবং আপনি দুটি বা তিনটি গ্রন্থাগার ব্যবহার করেন তবে এই বিলম্বটি প্রাসঙ্গিক হতে পারে, কারণ জাভাস্ক্রিপ্ট এক্সিকিউশনটি ব্লক করা হচ্ছে এবং প্রতিটি জেএস স্ক্রিপ্ট মেমরিতে লোড না হওয়া পর্যন্ত পৃষ্ঠাটি মূলত ফাঁকা থাকবে।
djjeck

উত্তর:


338

এইগুলি আমি খনন করতে সক্ষম হয়েছি এমন বিশদ। এটি প্রথমে লক্ষ্য করার মতো যে যদিও জাভাস্ক্রিপ্টটি সাধারণত একটি ভিএম-এর ব্যাখ্যা এবং চালিত হিসাবে বিবেচিত হয় তবে আধুনিক দোভাষীদের ক্ষেত্রে এটি সত্যিকার অর্থে ঘটেনি, যা সরাসরি উত্সটিকে মেশিন কোডে সংকলন করতে থাকে (আইআই ব্যতীত)।


ক্রোম: ভি 8 ইঞ্জিন

ভি 8 এর একটি সংকলন ক্যাশে রয়েছে। এই স্টোরগুলি 5 টি পর্যন্ত জঞ্জাল সংগ্রহের জন্য উত্সের একটি হ্যাশ ব্যবহার করে জাভাস্ক্রিপ্ট সংকলিত। এর অর্থ সোর্স কোডের দুটি অভিন্ন টুকরা সেগুলি কীভাবে অন্তর্ভুক্ত করা হয়েছিল তা নির্বিশেষে মেমরিতে ক্যাশে এন্ট্রি ভাগ করবে। পৃষ্ঠাগুলি পুনরায় লোড করার পরে এই ক্যাশেটি সাফ করা হয় না।

উৎস


আপডেট - 19/03/2015

ক্রোম টিম জাভাস্ক্রিপ্ট স্ট্রিমিং এবং ক্যাশিংয়ের জন্য তাদের নতুন কৌশল সম্পর্কে বিশদ প্রকাশ করেছে

  1. স্ক্রিপ্ট স্ট্রিমিং

স্ক্রিপ্ট স্ট্রিমিং জাভাস্ক্রিপ্ট ফাইলগুলির বিশ্লেষণকে অনুকূল করে। [...]

সংস্করণ ৪১ থেকে শুরু করে, ক্রোম ডাউনলোড শুরু হওয়ার সাথে সাথে একটি আলাদা থ্রেডে অ্যাসিঙ্ক এবং মুলতুবি স্ক্রিপ্টগুলি পার্স করে। এর অর্থ এই যে পার্সিংটি ডাউনলোডটি শেষ হওয়ার পরে মাত্র মিলিসেকেন্ডগুলি সম্পূর্ণ করতে পারে এবং ফলস্বরূপ পৃষ্ঠাগুলি 10% তত দ্রুত লোড হয়।

  1. কোড ক্যাচিং

সাধারণত, ভি 8 ইঞ্জিন প্রতিটি ভিজিট পৃষ্ঠার জাভাস্ক্রিপ্ট সংকলন করে, প্রসেসরের বোঝার নির্দেশকে রূপান্তরিত করে। সংকলিত কোডটি সংকলনের সময়ে মেশিনের রাজ্য এবং প্রেক্ষাপটের উপর নির্ভরশীল হিসাবে কোনও ব্যবহারকারী পৃষ্ঠা থেকে দূরে নেভিগেট হয়ে গেলে এই সংকলিত কোডটি বাতিল করা হয়।

ক্রোম 42 সংকলিত কোডটির স্থানীয় অনুলিপি সংরক্ষণের একটি উন্নত কৌশলটি প্রবর্তন করে, যাতে ব্যবহারকারী পৃষ্ঠায় ফিরে আসে ডাউনলোডিং, পার্সিং এবং সংকলন পদক্ষেপগুলি সমস্ত এড়িয়ে যেতে পারে। সমস্ত পৃষ্ঠা লোড জুড়ে, এটি ক্রোমকে প্রায় 40% সংকলন সময় এড়াতে দেয় এবং মোবাইল ডিভাইসে মূল্যবান ব্যাটারি সংরক্ষণ করে।


অপেরা: কারাকান ইঞ্জিন

অনুশীলনে এর অর্থ হ'ল যখনই কোনও স্ক্রিপ্ট প্রোগ্রাম সংকলিত হতে চলেছে, যার উত্স কোডটি সম্প্রতি সংকলিত কিছু অন্যান্য প্রোগ্রামের অনুরূপ, আমরা সংকলকটি থেকে পূর্ববর্তী আউটপুটটিকে পুনরায় ব্যবহার করি এবং সংকলনের পদক্ষেপটি পুরোপুরি এড়িয়ে যাই। এই ব্রাউজটি সাধারণত ব্রাউজিং পরিস্থিতিগুলিতে বেশ কার্যকর যেখানে একই সাইট থেকে পৃষ্ঠার পরে একটি পৃষ্ঠা লোড করে, যেমন একটি নিউজ সার্ভিসের বিভিন্ন সংবাদ নিবন্ধ, যেহেতু প্রতিটি পৃষ্ঠা প্রায়শই একই, কখনও কখনও খুব বড় স্ক্রিপ্ট লাইব্রেরি লোড করে।

অতএব জাভাস্ক্রিপ্ট পৃষ্ঠা পুনরায় লোড জুড়ে ক্যাশে করা হয়, একই স্ক্রিপ্টে দুটি অনুরোধ পুনরায় সংকলনের ফলে আসবে না।

উৎস


ফায়ারফক্স: স্পাইডারমোনকি ইঞ্জিন

স্পাইডারমনকি Nanojitতার নেটিভ ব্যাক-এন্ড হিসাবে ব্যবহার করে , একটি জেআইটি সংকলক। মেশিন কোডটি সংকলনের প্রক্রিয়াটি এখানে দেখা যায় । সংক্ষেপে, এটা মনে হচ্ছে, স্ক্রিপ্ট পুনরায় কম্পাইল করতে তারা লোড করা হয়। তবে, আমরা যদি অভ্যন্তরীণ দিকগুলি ঘুরে দেখি তবে Nanojitদেখতে পাচ্ছি যে উচ্চতর স্তরের মনিটর jstracer, যা সংকলন ট্র্যাক করতে ব্যবহৃত হয় তা সংকলনের সময় তিনটি ধাপের মধ্য দিয়ে রূপান্তর করতে পারে, এতে একটি সুবিধা প্রদান করে Nanojit:

ট্রেস মনিটরের প্রাথমিক অবস্থা পর্যবেক্ষণ করছে। এর অর্থ স্পাইডারমনকি বাইটকোডকে ব্যাখ্যা করছে। প্রতিবার স্পাইডারমনকি একটি পশ্চাদপদ-জাম্প বাইটকোডকে ব্যাখ্যা করে, মনিটর জাম্প-টার্গেট প্রোগ্রাম-কাউন্টার (পিসি) এর মান কতবার লাফিয়ে যায় তার নোট করে। এই নম্বরটিকে পিসির হিট কাউন্ট বলে। যদি কোনও নির্দিষ্ট পিসির হিট গণনা একটি প্রান্তিক মানের কাছে পৌঁছায়, লক্ষ্যটিকে গরম বলে বিবেচনা করা হয়।

যখন মনিটর লক্ষ্য করে যে কোনও পিসি গরম আছে, তখন লক্ষ্য পিসির জন্য দেশী কোডের একটি খণ্ড রয়েছে কিনা তা দেখতে এটি একটি হ্যাশটেবলের টুকরো টুকরো করে। যদি এটি এরকম একটি খণ্ড খুঁজে পায়, তবে এটি সম্পাদন মোডে রূপান্তর করে। অন্যথায় এটি রেকর্ডিং মোডে রূপান্তর করে।

এর অর্থ hotকোডের টুকরোগুলির জন্য নেটিভ কোডটি ক্যাশে করা হয়। যার অর্থ পুনরায় সংকলনের প্রয়োজন হবে না। এটি পরিষ্কার করা হয় না যে এই হ্যাশ দেশীয় বিভাগগুলি পৃষ্ঠা রিফ্রেশের মধ্যে বজায় রাখা হয়। তবে আমি ধরে নেব যে তারা। কেউ যদি এর জন্য সহায়ক প্রমাণ পেতে পারে তবে দুর্দান্ত।

সম্পাদনা : এটি উল্লেখ করা হয়েছে যে মজিলা বিকাশকারী বরিস জবারস্কি বলেছেন যে গেকো এখনও সঙ্কলিত স্ক্রিপ্টগুলি ক্যাশে করে না । এই এসও উত্তর থেকে নেওয়া ।


সাফারি: জাভাস্ক্রিপ্টকোর / স্কোয়ারেলফিশ ইঞ্জিন

আমি মনে করি যে এই বাস্তবায়নের সর্বোত্তম উত্তর ইতিমধ্যে অন্য কেউ দিয়েছেন

আমরা বর্তমানে বাইটকোড (বা নেটিভ কোড) ক্যাশে করি না। এটি এমন একটি
বিকল্প যা আমরা বিবেচনা করেছি, তবে বর্তমানে কোড জেনারেশন
জেএস বাস্তবায়ন সময়ের (<2%) ক্ষুদ্র অংশ, সুতরাং আমরা
এই মুহূর্তে এটি অনুসরণ করছি না ।

এটি সাফারির লিড ডেভেলপার ম্যাকিয়েজ স্টাচোয়িয়াক লিখেছিলেন । সুতরাং আমি মনে করি আমরা এটি সত্য হতে পারে।

আমি অন্য কোনও তথ্য সন্ধান করতে অক্ষম ছিল তবে আপনি এখানে সর্বশেষ SquirrelFish Extremeইঞ্জিনটির গতির উন্নতি সম্পর্কে আরও পড়তে পারেন, বা উত্সাহী বোধ করলে এখানে উত্স কোডটি ব্রাউজ করতে পারেন ।


আইই: চক্র ইঞ্জিন

এই ক্ষেত্রে আই 9 এর জাভাস্ক্রিপ্ট ইঞ্জিন (চক্র) সম্পর্কিত কোনও বর্তমান তথ্য নেই। কেউ কিছু জেনে থাকলে কমেন্ট করে জানাবেন।

এটি বেশ সরকারী, তবে আইআই এর পুরানো ইঞ্জিন বাস্তবায়নের জন্য এরিক লিপার্ট (জেএসক্রিপ্টের এমএস বিকাশকারী ) এখানে একটি ব্লগের জবাবে বলেছেন:

জেএসক্রিপ্ট ক্লাসিক একটি সংকলিত ভাষার মতো এই অর্থে কাজ করে যে কোনও জেএসক্রিপ্ট ক্লাসিক প্রোগ্রাম চলার আগে, আমরা কোডটি পুরোপুরি বাক্য গঠন করি, একটি সম্পূর্ণ পার্স ট্রি তৈরি করি এবং একটি বাইকোড তৈরি করি। এরপরে আমরা বাইটকোড দোভাষী দ্বারা বাইটকোড চালাই। সেই অর্থে, JScript জাভা হিসাবে "সংকলিত" হিসাবে প্রতিটি বিট। পার্থক্যটি হ'ল জেএসক্রিপ্ট আপনাকে আমাদের মালিকানাধীন বাইটকোডটি ধরে রাখতে বা পরীক্ষা করতে দেয় না । এছাড়াও, বাইটোকোডটি জেভিএম বাইটকোডের তুলনায় অনেক উচ্চ স্তরের - জেএসক্রিপ্ট ক্লাসিক বাইটোকোড ভাষা পার্স গাছের লিনিয়ারাইজেশন থেকে কিছুটা বেশি, যেখানে জেভিএম বাইটকোডটি একটি নিম্ন-স্তরের স্ট্যাক মেশিনে স্পষ্টভাবে পরিচালিত করার উদ্দেশ্যে তৈরি হয়েছে।

এটি পরামর্শ দেয় যে বাইটোকোড কোনওভাবেই স্থির থাকে না এবং এভাবে বাইটকোড ক্যাশে হয় না।


10
+1, দুর্দান্ত রচনাআপ। তবে ফায়ারফক্স সম্পর্কিত, দয়া করে এই স্ট্যাক ওভারফ্লো প্রশ্নটি দেখুন যেখানে মজিলা বিকাশকারী বরিস জবারস্কি ব্যাখ্যা করেছেন যে গেকো বর্তমানে এটি করেন না।
cha0site

ধন্যবাদ, আমি দেখেছি যে আমার ভ্রমণে তবে অন্য কোনও সহায়ক প্রমাণ খুঁজে পেল না। আমি উত্তর দিয়ে এটি সম্পাদনা করব।
জিভিংস

1
নোট করুন যে আইই সম্পর্কে যা বলা হয়েছিল 2003 সালে বলা হয়েছিল: আইই 9 এর জেএস ইঞ্জিনটি প্রথম প্রকাশটি ২০১১ সালে
আই

এছাড়াও, অপেরা কেবল পুনরায় লোডের চেয়ে বেশি জেএস বাইটকোডকে ক্যাশে করে। (তবে জেনারেটেড মেশিন-কোড ক্যাশে করা হয় না)।
gsnedders

2
@ জীবগুলি উপরের উত্স হিসাবে গ্রহণ করুন (আমি
কারাকান

12

অপেরা এটি করে, যেমন অন্য উত্তরে উল্লিখিত হয়েছে। ( উত্স )

ফায়ারফক্স (স্পাইডারমোনকি ইঞ্জিন) বাইটকোড ক্যাশে করে না । ( উত্স )

ওয়েবকিট (সাফারি, কনকরার) বাইটকোড ক্যাশে করে না । ( উত্স )

আমি IE [6/7/8] বা V8 (ক্রোম) সম্পর্কে নিশ্চিত নই, আমি মনে করি আইআই কিছু ধরণের ক্যাশে করতে পারে যখন ভি 8 না পারে। আইই বন্ধ সোর্স তাই আমি নিশ্চিত নই, তবে ভি 8-তে এটি "সংকলিত" কোড ক্যাশে করা বোধগম্য নয় কারণ তারা সরাসরি মেশিন কোডে সংকলন করে।


1
IE6–8 অবশ্যই না। আইই 9 হতে পারে তবে আমার কাছে কোনও উপায় নেই। সংকলিত জেএস সম্ভবত কোথাও ক্যাশেড নেই কারণ এটি প্রায়শই বেশ বড়।
gsnedders

@gsnedders: আমি নিশ্চিত নই যে IE8 প্রযুক্তিগতভাবে এটি করতে পারে না, মনে হয় এটি খুব বাইটকোডেও সংকলিত হয়েছে (অফিসিয়াল নয় তবে ঘনিষ্ঠ), সুতরাং এটি ক্যাশে না করার কোনও প্রযুক্তিগত কারণ নেই। আইই 9 দেশীয় কোডটি সংকলন করতে একটি জেআইটি যুক্ত করবে বলে মনে হচ্ছে।
cha0site

2
বাইটকোড আইই দ্বারা চিরকালের জন্য ব্যবহার করা হয়েছে। আইই 8 তে এটি নতুন কিছু নয়। এটি কেবলমাত্র যে কোনও দোভাষীকে দোভাষীর পারফরম্যান্স পার্স-টাইমের তুলনায় অনেক ধীরে ধীরে ধীরে ধীরে অপ্রাসঙ্গিক বলে দেয়। আইই 9 এর পুরোপুরি নতুন (স্ক্র্যাচ থেকে) জেএস ইঞ্জিন রয়েছে, সুতরাং দুজনের মধ্যে কিছুই অনুসরণ করে না।
gsnedders

3

আমি যতদূর জানি, কেবল অপেরা পার্স করা জাভাস্ক্রিপ্টকে ক্যাশে করে। "ক্যাশেড সংকলিত প্রোগ্রামগুলি" বিভাগটি এখানে দেখুন


ধন্যবাদ, অন্যান্য ব্রাউজার পরিবারেও কি আপনার আরও বিশদ রয়েছে?
আজ্রিয়াল

2

গুগল ডার্ট যে মূল্য নেই এই সমস্যাটিকে স্পষ্টতই "স্ন্যাপশট" এর মাধ্যমে মোকাবেলা করার - লক্ষ্যটি কোডের প্রাকৃত সংস্করণটি লোড করে আরম্ভ এবং লোডিং সময়ের গতি বাড়ানো।

তথ্যপ্রযুক্তিতে একটি ভাল লেখার ব্যবস্থা আছে @ http://www.infoq.com/articles/google-dart


0

আমি মনে করি সঠিক উত্তরটি "সর্বদা নয়"। আমি যা বুঝি সেগুলি থেকে, ব্রাউজার এবং সার্ভার উভয়ই ক্যাশেড হয় তা নির্ধারণে ভূমিকা রাখে। আপনার যদি প্রতিবারই ফাইলগুলি পুনরায় লোড করার দরকার হয় তবে আমার মনে হয় আপনি অ্যাপাচি (উদাহরণস্বরূপ) এর মধ্যে থেকে এটি কনফিগার করতে সক্ষম হবেন। অবশ্যই, আমি অনুমান করি যে ব্যবহারকারীর ব্রাউজারটি সেটিংটি উপেক্ষা করার জন্য কনফিগার করা যেতে পারে, তবে সম্ভবত এটি অসম্ভব।

সুতরাং আমি কল্পনা করব যে বেশিরভাগ ব্যবহারিক ক্ষেত্রে জাভাস্ক্রিপ্ট ফাইলগুলি নিজেরাই ক্যাশে করা হয় তবে প্রতিটি সময় পৃষ্ঠাটি লোড হওয়ার পরে গতিশীলভাবে পুনরায় ব্যাখ্যা করা হয়।


0

ব্রাউজারটি অবশ্যই ক্যাচিংয়ের ব্যবহার করে তবে হ্যাঁ, ব্রাউজারগুলি প্রতিবার একটি পৃষ্ঠা রিফ্রেশ করে জাভাস্ক্রিপ্টকে পার্স করে। কারণ যখনই কোনও পৃষ্ঠা ব্রাউজার দ্বারা লোড করা হয়, এটি 2 টি গাছ তৈরি করে 1. কনটেন্ট ট্রি এবং 2. রেন্ডার ট্রি।

এই রেন্ডার ট্রিটিতে ডোম উপাদানগুলির ভিজ্যুয়াল বিন্যাস সম্পর্কিত তথ্য রয়েছে। সুতরাং যখনই কোনও পৃষ্ঠা লোড হবে, জাভাস্ক্রিপ্টটি পার্স করা হবে এবং জাভাস্ক্রিপ্টের যে কোনও গতিশীল পরিবর্তনগুলি ডোম উপাদানটির অবস্থান প্রদর্শন / আড়াল করতে, উপাদান যুক্ত / অপসারণ পছন্দ করবে ব্রাউজারটিকে রেন্ডার ট্রিটিকে পুনরায় তৈরি করবে। তবে এফএফ এবং ক্রোমের মতো আধুনিক ব্রোজারগুলি এটিকে কিছুটা ভিন্নভাবে পরিচালনা করে, তাদের বর্ধিত রেন্ডারিংয়ের ধারণা রয়েছে, সুতরাং যখনই উপরে বর্ণিত জেএস দ্বারা গতিশীল পরিবর্তন হবে, কেবল তখনই এই উপাদানগুলিকে আবার রেন্ডার এবং পুনরায় রঙ করার কারণ ঘটবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.