ওয়েব ওয়ার্কার ধীরে ধীরে রিগের এক্সপ ম্যাচগুলি গণনা করে ধীর (3x) - কেবল ফায়ারফক্স


85

প্রথমে আমি কেবলমাত্র একটি নিয়মিত প্রকাশ তৈরি করেছি যা প্রকল্পের সমস্ত শিরোনাম ফাইলের তালিকার সাথে সমস্ত অনন্য বাহ্যিক গ্রন্থাগারের পাথের সাথে মেলে। আমি এক সপ্তাহ আগে সেই রেজিএক্সপ্যাক্স সম্পর্কিত একটি প্রশ্ন জিজ্ঞাসা করেছি

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

/** Will call result() callback with every match it founds. Asynchronous unless called 
 *  with interval = -1.
 *  Javadoc style comment for Arnold Rimmer and other Java programmers:
 *  
 * @param regex regular expression to match in string
 * @param string guess what
 * @param result callback function that accepts one parameter, string match
 * @param done callback on finish, has no parameters
 * @param interval delay (not actual interval) between finding matches. If -1, 
 *        function  will be blocking
 * @property working false if loop isn't running, otherwise contains timeout ID
 *           for use with clearTimeout
 * @property done copy of done parameter
 * @throws heavy boulders
**/
function processRegex(regex, string, result, done, interval) {
  var m;
  //Please tell me interpreter optimizes this
  interval = typeof interval!='number'?1:interval;
  //And this
  processRegex.done = done;
  while ((m = regex.exec(string))) {
    Array.prototype.splice.call(m,0,1);
    var path = m.join("");
    //It's good to keep in mind that result() slows down the process
    result(path);
    if (interval>=0) {
      processRegex.working = setTimeout(processRegex, 
                              interval, regex, string, 
                              result, done, interval);
      // Comment these out for maximum speed
      processRegex.progress = regex.lastIndex/string.length;
      console.log("Progress: "+Math.round(processRegex.progress*100)+"%");
      return;
    }
  }

  processRegex.working = false;
  processRegex.done = null;
  if (typeof done=="function")
    done();
}
processRegex.working = false; 

আমি এখানে পরীক্ষা করার পরিবর্তে একটি পরীক্ষার ফাইল তৈরি করেছি আমি এটি খুব নির্ভরযোগ্য ওয়েব হোস্টিংয়ে আপলোড করেছি: ডেমো - পরীক্ষার ডেটা

আমি যেটা খুব অবাক করেছিলাম তা হ'ল ওয়েব কর্মী এবং রেজিএক্সপ্লেক্সের ব্রাউজারের প্রয়োগের মধ্যে এত গুরুত্বপূর্ণ পার্থক্য রয়েছে। আমি যে ফলাফল পেয়েছি:

  • মোজিলা ফায়ারফক্স
    • [WORKER]: Time elapsed:16.860s
    • [WORKER-SYNC]: Time elapsed:16.739s
    • [TIMEOUT]: Time elapsed:5.186s
    • [LOOP]: Time elapsed:5.028s

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

function processRegexUnique(regex, string, result, done, interval) {
  var matchList = arguments[5]||[];
  ... same as before ...
  while ((m = regex.exec(string))) {
    ... same as before ...
    if (matchList.indexOf(path)==-1) {
      result(path);
      matchList.push(path);
    }
    if (interval>=0) {
      processRegex.working = setTimeout(processRegex, interval, 
                               regex, string, result, 
                               done, interval, matchList);
      ... same as before ...
    }
  }
  ... same as before ...
}

এবং ফলাফল:

  • মোজিলা ফায়ারফক্স
    • [WORKER]: Time elapsed:0.062s
    • [WORKER-SYNC]: Time elapsed:0.023s
    • [TIMEOUT]: Time elapsed:12.250s (নিজের কাছে নোট করুন: প্রতি মিনিটে এটি অস্থির হয়ে উঠছে)
    • [LOOP]: Time elapsed:0.006s

গতির এমন পার্থক্য কি কেউ ব্যাখ্যা করতে পারেন?


6
আপনি যদি এর জন্য ফায়ারফক্স বাগ দায়ের করেন তবে দয়া করে আপনার প্রশ্নের বাগের URL যুক্ত করতে পারেন? এবং যদি আপনি এখনও এটির জন্য ফায়ারফক্স বাগটি ফাইল না করেন তবে আমি আশা করি আপনি দয়া করে এটি করার জন্য সময় দেওয়ার বিষয়টি বিবেচনা করতে পারেন।
sideshowbarker

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

4
হ্যাঁ তারা সম্মত হয়েছে যে তারা এটি হিসাবে পরিষ্কার হতে পারে না। যাইহোক, এই নির্দিষ্ট বাগের জন্য, দয়া করে bugzilla.mozilla.org/… ব্যবহার করুন DOM: Workersযা এটি যথাযথ বাগজিলা Coreপণ্যের উপযুক্ত বাগজিলা উপাদানটির বিরুদ্ধে তুলবে ।
sideshowbarker

4
ফায়ারফক্স ব্রাউজার-ইঞ্জিন বাগগুলি কোথায় প্রতিবেদন করতে হবে তা নির্ধারণের চেষ্টা করার সাথে আপনি যে একই হতাশাগুলি এড়াতে পেরেছিলেন তাদের অন্যদের সাহায্য করার চেষ্টা করার জন্য, আমি স্ট্যাকওভারফ্লো / প্রশ্নগুলি তৈরি করেছি / 303059442/… আপনি যদি মনে করেন যে এখানে রেকর্ডে থাকা তথ্যটি ব্যবহার করা দরকারী স্ট্যাকওভারফ্লো, দয়া করে এটিকে উত্সাহিত করার বিষয়টি বিবেচনা করুন (অন্যথায় এটি যদি অন্যান্য হাঁটুকার্কের নিকটবর্তী সমস্ত বিষয় ডাউনভোটাররা ব্যান্ডওয়্যাগনে ঝাঁপ দেয় তবে মুছে ফেলার ঝুঁকি হতে পারে)।
sideshowbarker

4
নিদর্শন উদ্দেশ্যে ধীর। আরও কার্যকরী করার উপায় হ'ল লুক এড়িয়ে যাওয়া এবং তার পরিবর্তে রেফারেন্স অ্যারে ব্যবহার করা। কিন্তু এই প্রশ্নটি আসলে অনুকূল কোড লেখার বিষয়ে নয়।
টোমা জ্যাটো - মনিকা

উত্তর:


2

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

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

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