cari

Rumah  >  Soal Jawab  >  teks badan

javascript - Adakah terdapat cara untuk mengesan masa pelaksanaan kaedah segerak dalam js?

Perkara khusus adalah ini. Adakah sesiapa yang boleh mengesan masa pelaksanaan kaedah penyegerakan jika masa pelaksanaan terlalu lama, saya akan mengambil inisiatif untuk mematikan kaedah ini?

迷茫迷茫2721 hari yang lalu882

membalas semua(5)saya akan balas

  • typecho

    typecho2017-06-15 09:25:26

    Ini bergantung pada kaedah penyegerakan anda?

    • Jika ia adalah kaedah yang disediakan oleh perpustakaan pihak ketiga, ia bergantung kepada sama ada ia sendiri menyediakan kaedah berhenti Jika tidak, tiada apa yang boleh anda lakukan;

    • Jika ia melibatkan fail i/o/padam/buat, anda mungkin tidak dapat menghentikannya, tetapi anda boleh menulis fungsi songsang untuk memulihkan keadaan asal selepas ia melaporkan ralat

    • Jika kaedah ini ditulis sendiri dan mempunyai berbilang subfungsi, maka anda boleh menentukan pemasa di dalam fungsi dan menyemak sama ada masa melebihi nilai yang dibenarkan sebelum melaksanakan setiap subfungsi Ini adalah penyelesaian

    • Jika kaedah ini ditulis oleh anda dan hanya mempunyai satu langkah, memandangkan ia adalah kaedah yang memakan masa, mungkin terdapat gelung, jadi tidak mengapa untuk menyemak masa setiap kali ia gelung. . .
    • balas
      0
  • 世界只因有你

    世界只因有你2017-06-15 09:25:26

    Dari perspektif JS, apabila melaksanakan kaedah segerak, keseluruhan aplikasi akan disekat di dalamnya Pada masa ini, malah panggilan balik yang dicetuskan secara tak segerak oleh setTimeout hanya boleh dilaksanakan dalam Gelung Peristiwa selepas pelaksanaan kaedah segerak selesai. jadi ia tidak boleh dilaksanakan dalam kaedah segerak Semak masa pelaksanaannya sendiri dan Bunuh sendiri.

    Dari perspektif sains komputer, soalan yang ditanya sebenarnya adalah masalah terhenti klasik:

    Masalah terhenti (bahasa Inggeris: halting problem) ialah masalah dalam teori kebolehkiraan dalam logik dan matematik. Dari segi orang awam, masalah terhenti ialah masalah menentukan sama ada mana-mana program boleh menamatkan operasinya dalam masa yang terhad. Masalah ini bersamaan dengan masalah keputusan berikut: sama ada terdapat program P. Untuk sebarang program input w, ia boleh dinilai bahawa w akan berakhir dalam masa yang terhad atau gelung tanpa henti.

    Masalah ini sukar NP, yang bermaksud tiada algoritma dengan kerumitan masa yang boleh diterima untuk menyelesaikannya secara langsung.

    Tetapi melihat di luar algoritma akademik, terdapat banyak penyelesaian dalam kejuruteraan, seperti menggunakan Web Worker atau mekanisme pengurusan proses PM2, dsb., yang tidak akan dibincangkan di sini.

    balas
    0
  • 怪我咯

    怪我咯2017-06-15 09:25:26

    Kemudian anda hanya boleh melakukan multi-threading...
    http://www.w3school.com.cn/ht...
    Namun, cara membunuh js juga menjadi misteri...
    Akhirnya... anda boleh terus Bukankah lebih baik menggunakan asynchronous||||

    balas
    0
  • 黄舟

    黄舟2017-06-15 09:25:26

    console.time("time1")
    $("*").each(function(){})
    
    console.timeEnd("time1") 

    Saya telah diingatkan bahawa ini bukanlah penyelesaian yang lain mungkin hanya ini:

        var func = function(t1) {
            var sum = 0,
                t2;
            for (var i = 0; i <= 10000; i++) {
                sum += i;
                t2 = new Date().getTime() - t1;
                if (t2 > 1) {
                    throw '超时';
                }
            }
            console.log(sum);
        };
    
        try {
            func(new Date().getTime());
        } catch (e) {
            console.log(e);
        }

    Tidak semestinya sesuai untuk semua perniagaan, dan titik itu sendiri akan menjadikan proses lebih perlahan.

    balas
    0
  • 女神的闺蜜爱上我

    女神的闺蜜爱上我2017-06-15 09:25:26

    Pekerja web boleh melaksanakan logik pengiraan anda dalam urutan lain, kaedah onmessage boleh menerima keputusan pelaksanaan, dan kaedah penamatan boleh menamatkan pelaksanaan pekerja web

    var job001DoneIndictor=false;
    var myWorker = new Worker('job001.js');
    //接收worker传递过来的数据
    myWorker.onmessage = function(event){
        
      job001DoneIndictor=true;
    };
    setTimeout(function(){
        if(!job001DoneIndictor){
           myWorker.terminate();
           myWorker =null;
        }
    },5000);//设置超时检测时间

    balas
    0
  • Batalbalas