স্ট্রিংবফার.এপেন্ড () এর চেয়ে + অপারেটর কম পারফর্ম্যান্ট


91

আমার দলে, আমরা সাধারণত স্ট্রিং উপসংহারটি এরকম করি:

var url = // some dynamically generated URL
var sb = new StringBuffer();
sb.append("<a href='").append(url).append("'>click here</a>");

স্পষ্টত নীচে আরও অনেক বেশি পঠনযোগ্য:

var url = // some dynamically generated URL
var sb = "<a href='" + url + "'>click here</a>";

তবে জেএস বিশেষজ্ঞরা দাবি করেছেন যে +অপারেটর তুলনায় কম পারফরম্যান্ট StringBuffer.append()। এটা কি সত্যি?


93
জাভাস্ক্রিপ্টে কোনও স্ট্রিংবফার নেই
টমাস

7
ডন, আপনি জাভা উল্লেখ করছেন?
জেমস ম্যাকমাহন

আমার অভিজ্ঞতাটি ছিল যা [].join('')কিছু সত্যই তারযুক্ত আচরণ দেখিয়েছে, তাই আমি +: - /
শহীদগ্লাবিটজ

4
আমি জানি যে এখানে মৌলিক প্রশ্নটি স্ট্রিং কনটেনটেশন সম্পর্কিত তবে এইচটিএমএল উপাদান তৈরি করার সময় আপনার সাবধানতা অবলম্বন করা উচিত। আপনাদের উদাহরণ ভাঙতে পারে যদি urlরয়েছে 'বা \n
স্টাইল

উত্তর:


46

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

যদি আপনার সাথে দীর্ঘক্ষণের স্ট্রিং থাকে তবে অবশ্যই একটি অ্যারে.জাইন কৌশল ব্যবহার করুন। (বা পঠনযোগ্যতার জন্য এটির চারপাশে কিছু স্ট্রিংবাফার মোড়ক)) তবে আপনার স্ট্রিংগুলি সংক্ষিপ্ত হলে বিরক্ত করবেন না।


102

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

এখানে একটি বিস্তৃত পারফরম্যান্স বিশ্লেষণ যা বিভিন্ন বিভিন্ন ব্রাউজার জুড়ে সমস্ত বিভিন্ন জাভাস্ক্রিপ্ট উপসংহার পদ্ধতি ব্যবহার করে পারফরম্যান্স দেখায়; স্ট্রিং পারফরম্যান্স একটি বিশ্লেষণ

যোগ দিন () একবার, কনক্যাট () একবার, যোগ করুন () এর জন্য, + = ফর, কনক্যাট () এর জন্য

আরও:
আজাক্সিয়ান >> আই স্ট্রিং পারফরম্যান্স: অ্যারে.জোঁ বনাম + = অবিরত


9
গ্রাফ সম্পর্কে, যদি এটি সুস্পষ্ট না হয়; স্বল্পতা ভালো.
টেকিন

4
"আই things এর সাথে পারফরম্যান্সের উন্নতির সাথে প্রথম জিনিসগুলি, বৃহত্তর স্কেল স্ট্রিং অপারেশনগুলি করার সময় আমাদের আর বিকল্প পথটি বিবেচনা করার দরকার নেই; পুনরাবৃত্তির পরিস্থিতিতে অ্যারে.জাইন ব্যবহার করা আপনাকে একই পরিস্থিতিতে + = ব্যবহার করার চেয়ে বড় কোনও সুবিধা দেয় না। এছাড়াও, আই 6 এর সাথে পার্থক্যগুলি আপনাকে সেই নির্দিষ্ট সংস্করণটির জন্য কাঁটাচামচা করতে বিরক্ত করার অনুমতি দেওয়ার জন্য যথেষ্ট সামান্য ছিল। "
ক্রিস এস

4
@ ক্রিস, এটি সত্য নয়। এই দুটি fiddles তুলনা IE7 : jsfiddle.net/9uS4n/5 বনাম (দ্রুত) jsfiddle.net/9uS4n/2 (ধীর)। join()কৌশলটি ব্যবহার করে পারফরম্যান্সে কমপক্ষে 1000 গুণ উন্নতি হয়েছে বলে মনে হয় ।
কর্ক ওল

সুন্দর ব্যাখ্যা। দয়া করে এটি পর্যালোচনা করুন: iliadraznin.com/2012/03/…
উইল 824

37

হ্যাঁ এটি সত্য তবে আপনার যত্ন নেওয়া উচিত নয়। যেটি পড়া সহজ one আপনার যদি অ্যাপ্লিকেশনটি বেনমার্ক করতে হয়, তবে বাধাগুলিতে মনোনিবেশ করুন।

আমি অনুমান করব যে স্ট্রিং কনটেনটেশন আপনার বাধা হয়ে উঠবে না।


31

তার সঙ্গে একমত হয়েছেন মাইকেল হরেন

এছাড়াও অ্যারের ব্যবহার বিবেচনা করুন এবং কার্য সম্পাদন যদি সত্যই সমস্যা হয় তবে যোগদান করুন।

var buffer = ["<a href='", url, "'>click here</a>"];
buffer.push("More stuff");
alert(buffer.join(""));

4
আমি জানি যে একটি সঠিক উত্তর নির্বাচন করা হয়েছে, তবে এই উত্তরটির আরও কার্যকর উদাহরণ রয়েছে।
জেসন স্পারস্কে

4
সত্যিই চমৎকার. এই দুটি fiddles তুলনা IE7 : jsfiddle.net/9uS4n/5 বনাম (দ্রুত) jsfiddle.net/9uS4n/2 (ধীর)। এই কৌশলটি ব্যবহার করে পারফরম্যান্সে কমপক্ষে 1000 গুণ উন্নতি হয়েছে বলে মনে হয়।
কর্ক ওল

@ কিরকওয়াল: ভবিষ্যতে জেএসফিউর ব্যবহার করতে পারে যাতে আমরা ফলাফলগুলি সহজেই তুলনা করতে পারি।
rvighne

আমি ইদানীং এটি করে চলেছি, একটি। নেট স্ট্রিংবিল্ডারের সাথে একই কোড স্টাইল, var sb = []; sb.push ("বিভাগ 1"); sb.push ("বিভাগ 2"); রিটার্ন sb.join ('');
স্যাম জোন্স

এই jsPerf jsperf.com/join-concat/2 এ উল্লেখ করেছে: stackoverflow.com/questions/16696632/... নির্দেশ করে বলে মনে হয় +=দ্রুততর।
সিরো সান্তিলি 郝海东 冠状 病 六四 事件 法轮功

18

এটা চেষ্টা কর:

var s = ["<a href='", url, "'>click here</a>"].join("");

ঠিক আছে, আপনার উত্তরে আপনি যে পোস্টটির সাথে লিঙ্ক করেছেন সেটি বিশেষভাবে অ্যারে.জোঁইনের "মিথ "টিকে অস্বীকার করার চেষ্টা করে যা আমার উত্তরটি সূচিত করে। সুতরাং সম্ভবত না। আমি যা দেখেছি তা অনুশীলনে আরও দ্রুত হতে পেরেছি।
রাহুল

স্ট্রিং কনক্যাট এই পদ্ধতি পছন্দ।
bkwdesign

8

ইতিমধ্যে কিছু ব্যবহারকারী উল্লেখ করেছেন: এটি ছোট স্ট্রিংগুলির জন্য অপ্রাসঙ্গিক।

এবং ফায়ারফক্স, সাফারি বা গুগল ক্রোমে নতুন জাভাস্ক্রিপ্ট ইঞ্জিনগুলি এটি অপ্টিমাইজ করে

"<a href='" + url + "'>click here</a>";

হিসাবে দ্রুত

["<a href='", url, "'>click here</a>"].join("");

8

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

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


6

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


4
Ditionতিহ্যগতভাবে স্ট্রিংবাফারকে সংক্ষিপ্তকরণের জন্য ব্যবহার করা হয় কারণ পূর্বের ও (এন) সময় জটিলতা রয়েছে যেখানে ও (এন ^ 2) হিসাবে পরে থাকে, সুতরাং পার্থক্যটি বড় এন (তবে ছোট এন এর জন্য নয়) জন্য তাত্পর্যপূর্ণ। যে কোনও ক্ষেত্রে ও (N ^ 2) দৃশ্য ব্যবহারের পরিবেশের উপর নির্ভর করে জাভাস্ক্রিপ্টের ক্ষেত্রে নাও হতে পারে।
redcalx

4

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

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


3

দ্রুত বেঞ্চমার্ক সেটআপ করা এবং jspref.com ব্যবহার করে জাভাস্ক্রিপ্টের পারফরম্যান্সের বিভিন্নতাগুলি পরীক্ষা করা বেশ সহজ । যা সম্ভবত এই প্রশ্ন জিজ্ঞাসা করা হয়েছিল যখন কাছাকাছি ছিল না। তবে এই প্রশ্নে লোকজনদের হোঁচট খাওয়ার জন্য তাদের উচিত সাইটের দিকে নজর দেওয়া।

আমি http://jsperf.com/string-concat-methods-test এ বিভিন্ন পদ্ধতিতে কনকনেটেশনের একটি দ্রুত পরীক্ষা করেছি ।


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

2

আমি কার্যকরী শৈলী ব্যবহার করতে চাই, যেমন:

function href(url,txt) {
  return "<a href='" +url+ "'>" +txt+ "</a>"
}

function li(txt) {
  return "<li>" +txt+ "</li>"
}

function ul(arr) {
  return "<ul>" + arr.map(li).join("") + "</ul>"
}

document.write(
  ul(
    [
      href("http://url1","link1"),
      href("http://url2","link2"),
      href("http://url3","link3")
    ]
  )
)

এই শৈলীটি পঠনযোগ্য এবং স্বচ্ছ দেখাচ্ছে। এটি ইউটিলিটি তৈরির দিকে নিয়ে যায় যা কোডে পুনরাবৃত্তি হ্রাস করে।

এটি স্বয়ংক্রিয়ভাবে মধ্যবর্তী স্ট্রিং ব্যবহার করার ঝোঁকও দেয়।


1

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


এটি আসলে খারাপ পরামর্শ নয়, কেন জানি এতটা ভোট পড়েছে। আমি জানি এটি নির্দিষ্ট প্রশ্নের উত্তর দেয় না, তবে এটি সাধারণত ভাল পরামর্শ হিসাবে স্বীকৃতির দাবিদার।
চোখের পলকহীনতা

0

হ্যাঁ, সাধারণ মানদণ্ড অনুসারে। ইজি: http://mckoss.com/jscript/SpeedTrial.htm

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

আপনি আরও ভালভাবে ডিওএম হেরফেরটি দেখতে চাইবেন।


লিংক মারা গেছে .. https://web.archive.org/web/20150912072015/http://mckoss.com/jscript/SpeedTrial.htm ওয়েব সংরক্ষণাগার সংস্করণে পয়েন্ট।
টনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.