ডিওটিমাইজড না হয়ে উচ্চ-পারফরম্যান্স জাভাস্ক্রিপ্ট কোড লেখা


10

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

  1. আমরা সবসময়ই চাই যে আমাদের অ্যারেগুলি এসএমআই (ছোট পূর্ণসংখ্যার) প্যাক করা হোক বা প্যাকড ডাবল হয়ে থাকুক, তার উপর নির্ভর করে আমরা পূর্ণসংখ্যা করছি বা ভাসমান-পয়েন্ট গণনা করছি।
  2. আমরা সর্বদা একই ধরণের জিনিসটিকে ফাংশনে স্থানান্তরিত করতে চাই, যাতে তারা "মেগামোরফিক" লেবেলযুক্ত না হয়ে ডিওপিটিমাইজ হয়। উদাহরণস্বরূপ, আমরা সবসময় কলিং করতে চান vec.add(x, y)উভয় সঙ্গে xএবং yহচ্ছে বস্তাবন্দী SMI অ্যারে, অথবা উভয় ডাবল অ্যারে বস্তাবন্দী।
  3. আমরা চাই ফাংশনগুলি যথাসম্ভব ইনডিল করা হোক।

যখন এই ক্ষেত্রেগুলির বাইরে কেউ স্ট্রেস করে, হঠাৎ এবং কঠোর পারফরম্যান্স ড্রপ অফ ঘটে। এটি বিভিন্ন নিরীহ কারণে হতে পারে:

  1. আপনি একটি প্যাকড এসএমআই অ্যারে এর সমতুল্য মত আপাতদৃষ্টিতে নিরীহ অপারেশনের মাধ্যমে একটি প্যাকড ডাবল অ্যারে রূপান্তর করতে পারেন myArray.map(x => -x)। এটি আসলে "সেরা" খারাপ মামলা, যেহেতু প্যাকড ডাবল অ্যারে এখনও খুব দ্রুত।
  2. আপনি একটি প্যাকযুক্ত অ্যারেটিকে জেনেরিক বক্সযুক্ত অ্যারেতে পরিণত করতে পারেন, উদাহরণস্বরূপ কোনও ফাংশনের উপরে অ্যারে ম্যাপিংয়ের মাধ্যমে (অপ্রত্যাশিতভাবে) ফিরে এসেছে nullবা undefined। এই খারাপ কেসটি এড়ানো মোটামুটি সহজ।
  3. আপনি একটি পুরো ফাংশনটিকে ডিওপিএমাইজ করতে পারেন যেমন vec.add()অনেক ধরণের জিনিসগুলিতে পাস করে এবং এটিকে মেগামোরফিক পরিণত করে। আপনি যদি "জেনেরিক প্রোগ্রামিং" করতে চান তবে এটি ঘটতে পারে vec.add()যেখানে আপনি টাইপ সম্পর্কে যত্নবান নন এমন ক্ষেত্রে (যাতে এটি প্রকারের মধ্যে প্রচুর পরিমাণে আসে দেখায়) উভয় ক্ষেত্রে ব্যবহৃত হয় এবং আপনি সর্বাধিক সম্পাদন করতে চান এমন ক্ষেত্রে (উদাহরণস্বরূপ, এটি কেবল কখনই বক্সযুক্ত ডাবল গ্রহণ করা উচিত)।

কোডটি সুন্দর এবং পঠনযোগ্য রাখার সময়ে কেউ কীভাবে উপরের বিবেচনার আলোকে উচ্চ-পারফরম্যান্স জাভাস্ক্রিপ্ট কোড লেখেন সে সম্পর্কে আমার প্রশ্নটি আরও নরম প্রশ্ন। কিছু নির্দিষ্ট সাব-প্রশ্ন যাতে আপনি জানেন যে আমি কী ধরণের উত্তরটির জন্য লক্ষ্য করছি:

  • প্যাকড এসএমআই অ্যারে (উদাহরণস্বরূপ) বিশ্বে থাকাকালীন প্রোগ্রাম করার জন্য কোথাও গাইডলাইনের সেট রয়েছে?
  • vec.add()কলসাইটের মতো জিনিসগুলিকে ইনলাইন করতে কোনও ম্যাক্রো সিস্টেমের মতো কিছু না ব্যবহার করে জাভাস্ক্রিপ্টে জেনেরিক উচ্চ-পারফরম্যান্স প্রোগ্রামিং করা সম্ভব?
  • মেগামোরফিক কল সাইট এবং ডিওপিমাইজেশনের মতো জিনিসের আলোকে কোনও কীভাবে হাই-পারফরম্যান্স কোডটিকে লাইবারিগুলিতে পরিণত করে? উদাহরণস্বরূপ, যদি আমি আনন্দের Aসাথে দ্রুত গতিতে লিনিয়ার বীজগণিত প্যাকেজটি ব্যবহার করি এবং তারপরে আমি একটি প্যাকেজ আমদানি করি Bযা নির্ভর করে Aতবে Bএটি অন্য ধরণের সাথে কল করে এবং এটি ডিওপিটিমাইজ করে, হঠাৎ (আমার কোড পরিবর্তন না করে) আমার কোডটি ধীর গতিতে চলে।
  • জাভাস্ক্রিপ্ট ইঞ্জিন প্রকারের সাথে অভ্যন্তরীণভাবে কী করছে তা যাচাই করার জন্য কি পরিমাপের সরঞ্জামগুলি ব্যবহার করার কোন সহজ ?

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

"উচ্চতর পারফরম্যান্স জাভাস্ক্রিপ্ট কোডটি কীভাবে লেখেন সে সম্পর্কে আমার প্রশ্নটি আরও নরম প্রশ্ন ..." একদিকে যেমন নোট করুন যে জাভাস্ক্রিপ্টটি পটভূমির প্রক্রিয়াগুলির (ওয়েব কর্মীদের) বিস্তৃতকরণের জন্য সরবরাহ করে এবং এমন লাইব্রেরিও রয়েছে যা এতে ট্যাপ করে থাকে into জিপিইউ (টেনসরফ্লো.জেএসস এবং জিপিইউ.জেএস) অফার মানে জাভাস্ক্রিপ্ট ভিত্তিক অ্যাপ্লিকেশনটির কম্পিউটেশনাল থ্রুপুট বাড়ানোর জন্য সম্পূর্ণ সংকলনের উপর নির্ভর করা ছাড়াও ...
জন ট্রেন্ট

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

জাভাস্ক্রিপ্টে পূর্ণসংখ্যার গাণিতিকগুলির জন্য, আপনি সম্ভবত asm.js- স্টাইল কোডটি দেখছেন, মোটামুটি " |0প্রতিটি ক্রিয়াকলাপের পিছনে রেখে "। এটি সুন্দর নয়, তবে এমন ভাষাতে আপনি সবচেয়ে ভাল করতে পারেন যার যথাযথ পূর্ণসংখ্যা নেই। আপনি বিগআইএন্টসও ব্যবহার করতে পারেন তবে আজকের মতো সাধারণ ইঞ্জিনগুলির মধ্যে এটি খুব দ্রুত নয় (বেশিরভাগ চাহিদার অভাবে)।
jmrk

উত্তর:


8

এখানে ভি 8 বিকাশকারী। এই প্রশ্নে আগ্রহের পরিমাণ এবং অন্যান্য উত্তরের অভাবে আমি এটিকে একটি শট দিতে পারি; আমি আশঙ্কা করছি আপনি যে উত্তরটি আশা করেছিলেন তা এটি হবেনা।

প্যাকড এসএমআই অ্যারে (উদাহরণস্বরূপ) বিশ্বে থাকাকালীন প্রোগ্রাম করার জন্য কোথাও গাইডলাইনের সেট রয়েছে?

সংক্ষিপ্ত উত্তর: এটা ঠিক এখানে দেওয়া হল: const guidelines = ["keep your integers small enough"]

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

যখন আমরা পারফরম্যান্স পরামর্শ সম্পর্কে কথা বলি, তখন আমরা সেটিকে মাথায় রাখার চেষ্টা করি এবং সাবধানতার সাথে অনুমান করতে পারি যে কোন পরামর্শগুলিতে অনেকগুলি ইঞ্জিন এবং বহু বছর ধরে বৈধ থাকার উচ্চ সম্ভাবনা রয়েছে, এবং এটি যুক্তিযুক্তভাবে মূ .় / অ-গোপনীয়ও নয়।

হাতের উদাহরণটিতে ফিরে আসা: অভ্যন্তরীণভাবে স্মিস ব্যবহার করা এমন একটি বাস্তবায়ন বিশদ হিসাবে বিবেচিত যা ব্যবহারকারীর কোড সম্পর্কে জানার প্রয়োজন নেই। এটি কিছু ক্ষেত্রে আরও দক্ষ করে তুলবে এবং অন্য ক্ষেত্রে আঘাত না দেওয়া উচিত। সমস্ত ইঞ্জিন স্মিস ব্যবহার করে না (উদাহরণস্বরূপ, এএফাইক ফায়ারফক্স / স্পাইডারমনকি historতিহাসিকভাবে করেনি; আমি শুনেছি যে কিছু কিছু ক্ষেত্রে তারা আজকাল স্মিস ব্যবহার করে; তবে আমি কোনও বিবরণ জানি না এবং কোনও কর্তৃপক্ষের সাথে কথা বলতে পারি না) ব্যাপার). ভি 8-তে, স্মিসের আকারটি একটি অভ্যন্তরীণ বিশদ এবং প্রকৃতপক্ষে সময়ের সাথে সাথে সংস্করণগুলির পরিবর্তিত হয়ে আসছে। 32-বিট প্ল্যাটফর্মে, যা সর্বাধিক ব্যবহারের ক্ষেত্রে ব্যবহৃত হত, স্মিস সবসময় 31-বিট স্বাক্ষরিত পূর্ণসংখ্যার হয়ে থাকে; -৪-বিট প্ল্যাটফর্মে তারা 32-বিট স্বাক্ষরিত পূর্ণসংখ্যার ব্যবহার করত, যা ক্রোম 80-তে না হওয়া পর্যন্ত আমরা "পয়েন্টার সংকোচনের" প্রেরণ না করা পর্যন্ত সর্বাধিক সাধারণ ক্ষেত্রে বলে মনে হয়েছিল -৪-বিট আর্কিটেকচারের জন্য, যার 32 টি-বিট প্ল্যাটফর্মগুলি থেকে জানা 31 বিটের মধ্যে এসি আকার কমিয়ে আনতে হবে। আপনি যদি স্মৃতিটি সাধারণত 32 বিট অনুমানের উপর ভিত্তি করে কোনও বাস্তবায়ন ভিত্তিক করে থাকেন তবে দুর্ভাগ্যজনক পরিস্থিতি আপনি পাবেনএই

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

Vec.add () এর মতো জিনিসগুলিকে কলসিতে ইনলাইন করতে কোনও ম্যাক্রো সিস্টেমের মতো কিছু না ব্যবহার করে জাভাস্ক্রিপ্টে জেনেরিক উচ্চ-পারফরম্যান্স প্রোগ্রামিং করা সম্ভব?

"জেনেরিক" সাধারণত "উচ্চ-পারফরম্যান্স" এর সাথে দ্বিমত পোষণ করে। এটি জাভাস্ক্রিপ্ট, বা নির্দিষ্ট ইঞ্জিন বাস্তবায়নের সাথে সম্পর্কিত নয়।

"জেনেরিক" কোড মানে রানটাইম সময়ে সিদ্ধান্ত নিতে হয়। প্রতিবার আপনি কোনও ক্রিয়াকলাপ চালানোর সময়, কোডটি নির্ধারণের জন্য রান করতে হবে, বলুন, " xএকটি পূর্ণসংখ্যা? যদি তাই হয় তবে সেই কোডের পথটি ধরুন xa স্ট্রিং? তারপরে এখানে লাফ দিন an এটি কি কোনও বস্তু? এটি আছে .valueOf? না? তাহলে?" হতে .toString()পারে? সম্ভবত এটির প্রোটোটাইপ শৃঙ্খলে? কল করুন এবং তার ফলাফল দিয়ে প্রথম থেকেই পুনরায় শুরু করুন "। "উচ্চ-কার্যকারিতা" অনুকূলিতকরণ কোডটি এই সমস্ত গতিশীল চেকগুলি ফেলে দেওয়ার জন্য মূলত নির্মিত হয়েছে; কেবলমাত্র তখনই সম্ভব যখন ইঞ্জিন / সংকলকটির আগে সময়ের ধরণের অনুমানের কিছু উপায় থাকে: যদি এটি প্রমাণ করতে পারে (বা উচ্চ পর্যায়ে সম্ভাব্যতার সাথে ধরে নেওয়া যায়) যা xসর্বদা একটি পূর্ণসংখ্যার হতে চলেছে, তবে কেবলমাত্র সে ক্ষেত্রে কোড তৈরি করা দরকার ( অপ্রমাণিত অনুমান জড়িত ছিল কিনা তা টাইপ চেক দ্বারা সুরক্ষিত)।

ইনলাইনিং এই সমস্তের কাছে অর্থগোনাল। একটি "জেনেরিক" ফাংশনটি এখনও অন্তর্ভুক্ত হতে পারে। কিছু ক্ষেত্রে, সংকলক সেখানে পলিমারফিজম হ্রাস করার জন্য অন্তর্ভুক্ত ফাংশনটিতে প্রকারের তথ্যের প্রচার করতে সক্ষম হতে পারে।

(তুলনার জন্য: সি ++, একটি স্ট্যাটিকালি সংকলিত ভাষা হওয়ায় কোনও সম্পর্কিত সমস্যা সমাধানের জন্য টেমপ্লেট রয়েছে In সংক্ষেপে, তারা প্রোগ্রামারকে স্পষ্টরূপে প্রদত্ত প্রকারগুলিতে প্যারামিটারাইজড ফাংশনগুলির (বা পুরো ক্লাসের) অনুলিপি তৈরি করতে সংকলককে নির্দেশ দেয় That's এটি একটি কিছু ক্ষেত্রে দুর্দান্ত সমাধান, তবে নিজস্ব ঘাটতিগুলির সেট ছাড়াই নয়, উদাহরণস্বরূপ দীর্ঘ সময় এবং বৃহত বাইনারিগুলি সংগ্রহ করুন Java জাভাস্ক্রিপ্টের অবশ্যই টেমপ্লেটগুলির মতো কোনও জিনিস নেই evala আপনি কোনও সিস্টেমটি তৈরি করতে ব্যবহার করতে পারেন যা কিছুটা অনুরূপ, তবে তারপরে আপনি একই ধরণের অসুবিধাগুলির মধ্যে দৌড়াতে হবে: রানটাইম সময় আপনাকে সি ++ কম্পাইলারের কাজের সমতুল্য কাজ করতে হবে এবং আপনি যে কোডটি তৈরি করছেন তার নিখুঁত পরিমাণ সম্পর্কে আপনাকে চিন্তিত করতে হবে))

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

হ্যাঁ, এটি জাভাস্ক্রিপ্টের সাথে একটি সাধারণ সমস্যা। Array.sortজাভাস্ক্রিপ্টে অভ্যন্তরীণভাবে নির্দিষ্ট কিছু বিল্টিন (জিনিসগুলির ) প্রয়োগ করতে ভি 8 ব্যবহার করত এবং এই সমস্যাটি (যা আমরা "টাইপ ফিডব্যাক দূষণ" বলে থাকি) কেন আমরা সেই কৌশল থেকে সম্পূর্ণ দূরে সরে এসেছি তার অন্যতম প্রধান কারণ ছিল।

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

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

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

টাইপস্ক্রিপ্ট ব্যবহার সাহায্য করতে পারে। বড় ফ্যাট সতর্কতা: টাইপস্ক্রিপ্টের ধরণেরগুলি বিকাশকারী উত্পাদনশীলতার দিকে লক্ষ্য করা হয়, এক্সিকিউশন পারফরম্যান্স নয় (এবং যেমন দেখা যাচ্ছে যে এই দুটি দৃষ্টিভঙ্গির একটি টাইপ সিস্টেমের থেকে খুব আলাদা প্রয়োজন)। এটি বলেছিল, এখানে কিছু ওভারল্যাপ রয়েছে: উদাহরণস্বরূপ আপনি যদি ধারাবাহিকভাবে জিনিসগুলি বর্ননা করেন numberতবে টিএস সংকলক আপনাকে সতর্ক করে দেবে যদি আপনি ঘটনাক্রমে nullএমন একটি অ্যারে বা ফাংশন রাখেন যা কেবলমাত্র সংখ্যায় থাকে / চালিত হয়। অবশ্যই, শৃঙ্খলা আবশ্যক: একটি একক number_func(random_object as number)পালানোর হ্যাচ নিঃশব্দে সমস্ত কিছু হ্রাস করতে পারে, কারণ ধরণের টীকাগুলির যথার্থতা কোথাও প্রয়োগ করা হয় না।

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

জাভাস্ক্রিপ্ট ইঞ্জিন প্রকারের সাথে অভ্যন্তরীণভাবে কী করছে তা যাচাই করার জন্য কি পরিমাপের সরঞ্জামগুলি ব্যবহার করার কোন সহজ?

না, এবং এটি উদ্দেশ্যমূলক। উপরে বর্ণিত হিসাবে, আমরা চাই না যে আপনি বিশেষভাবে ভি 8 আজ যে ধরণের নিদর্শনগুলিতে বিশেষভাবে অনুকূল করতে পারেন তার জন্য আপনার কোডটি বিশেষভাবে তৈরি করুন এবং আমরা বিশ্বাস করি না যে আপনি সত্যিই এটি করতে চান। জিনিসগুলির সেটটি যে কোনও দিকে পরিবর্তিত হতে পারে: যদি এমন কোনও প্যাটার্ন থাকে যা আপনি ব্যবহার করতে চান তবে ভবিষ্যতের সংস্করণে আমরা এটির জন্য অনুকূলিত করতে পারি (পূর্বে বিন্যাসবিহীন 32-বিট পূর্ণসংখ্যকে অ্যারে উপাদান হিসাবে সংরক্ষণ করার ধারণাটি নিয়ে আমরা খেলাম ... .কিন্তু এটি নিয়ে কাজ এখনও শুরু হয়নি, সুতরাং কোন প্রতিশ্রুতি নেই); এবং কখনও কখনও যদি এমন কোনও প্যাটার্ন থাকে যা আমরা অতীতে অপ্টিমাইজ করতে ব্যবহার করি, তবে আমরা যদি সিদ্ধান্ত নিতে পারি যে এটি অন্য, আরও গুরুত্বপূর্ণ / প্রভাবশালী অপ্টিমাইজেশনের পথে চলে যায় তবে drop এছাড়াও, ইনলাইনিং হিউরিস্টিক্সের মতো জিনিসগুলি সঠিকভাবে অর্জন করা কুখ্যাতভাবে কঠিন, সুতরাং সঠিক সময়ে সঠিক ইনলাইনিং সিদ্ধান্ত নেওয়া চলমান গবেষণা এবং ইঞ্জিন / সংকলক আচরণের সাথে সম্পর্কিত পরিবর্তনগুলির একটি ক্ষেত্র; এটি এটি অন্য ক্ষেত্রে তৈরি করে যেখানে এটি সবার জন্য দুর্ভাগ্যজনক হবে (আপনার জন্যএবং আমাদের) আপনি যদি মনে করেন যে বর্তমান ব্রাউজার সংস্করণগুলির কয়েকটি সেট আপনার মনে হয় (বা জানেন?) সেরা অন্তর্নিহিত সিদ্ধান্তগুলি না করা পর্যন্ত আপনার কোড টিকেট করতে অনেক সময় ব্যয় করেছে তবে কেবলমাত্র তত্কালীন ব্রাউজারগুলি উপলব্ধি করার জন্য অর্ধ বছর পরে ফিরে আসবে তাদের তাত্পর্যপূর্ণ পরিবর্তন হয়েছে।

আপনি অবশ্যই অবশ্যই সর্বদা আপনার অ্যাপ্লিকেশনটির পারফরম্যান্স পরিমাপ করতে পারেন - এটিই শেষ পর্যন্ত গুরুত্বপূর্ণ, ইঞ্জিনটি অভ্যন্তরীণভাবে কী পছন্দ করে তা নয়। মাইক্রোব্যাঙ্কমার্কগুলি থেকে সাবধান থাকুন কারণ তারা বিভ্রান্তিকর: আপনি যদি কেবল দুটি লাইনের কোড বের করেন এবং সেগুলি বেনমার্ক করেন তবে সম্ভাবনা রয়েছে যে ইঞ্জিনটি একেবারে পৃথক সিদ্ধান্ত নেবে ly


2
এই উত্তরের উত্তরের জন্য ধন্যবাদ, এটি জিনিসগুলি কীভাবে কাজ করে এবং কীভাবে তারা কাজ করার পরিকল্পনা নিয়েছিল তা সম্পর্কে আমার সন্দেহের অনেকটিকে নিশ্চিত করে । যাইহোক, আপনি উল্লিখিত "টাইপ প্রতিক্রিয়া" সমস্যা সম্পর্কে কোনও ব্লগ পোস্ট ইত্যাদি আছে Array.sort()? আমি এটি সম্পর্কে কিছুটা আরও পড়তে চাই।
জেপি

আমি মনে করি না যে আমরা সেই বিশেষ দিকটি নিয়ে ব্লগ করেছি। এটি মূলত আপনি নিজের প্রশ্নের মধ্যে যা বর্ণনা করেছেন তা নিজেই: যখন জাভাস্ক্রিপ্টে বিল্টিনগুলি প্রয়োগ করা হয়, তখন সেগুলি "লাইব্রেরির মতো" এই অর্থে হয় যে যদি কোডের বিভিন্ন টুকরা বিভিন্ন ধরণের সাথে তাদের কল করে, তবে পারফরম্যান্স ক্ষতিগ্রস্থ হতে পারে - কখনও কখনও কেবল সামান্য, কখনও কখনও আরও। এটি একমাত্র ছিল না, এবং তর্কসাপেক্ষভাবে সেই কৌশলটি নিয়েও সবচেয়ে বড় সমস্যা ছিল না; আমি বেশিরভাগই কেবল বলতে চেয়েছিলাম যে আমি সাধারণ সমস্যাটির সাথে পরিচিত।
jmrk
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.