مقامی ملٹی تھریڈ جاوا اسکرپٹ اور WASM کارکردگی کا موازنہ

مصنف:ایجاد کنندہ کوانٹائزیشن، تاریخ: 2023-02-23 17:35:24
ٹیگز:ملٹی تھریڈ

موجدوں نے مقامی نچلے درجے سے جاوا اسکرپٹ کو حقیقی معنی کے متعدد موضوعات کی حمایت کرنے کی کوشش کی ہے اور WASM کی خصوصیت کو شامل کیا ہے۔ ذیل میں ایک ڈیمو ہے جس میں تازہ ترین میزبانوں کو ڈاؤن لوڈ کرنے کا تجربہ کیا جاسکتا ہے۔ یہ غیر جاوا اسکرپٹ ورکر کی خصوصیت ہے جو متعدد دھاگوں کے اندر ایک دوسرے کے ساتھ یا مرکزی دھاگے کے ساتھ بات چیت کرنے کے لئے استعمال کی جاسکتی ہے۔

C زبان میں ٹرانسفارمرز اس ویب سائٹ سے ٹیسٹ تیار کرسکتے ہیں:https://wasdk.github.io/WasmFiddle/

سی زبان کا کوڈ جو wasm کے طور پر مرتب کیا گیا ہے:

int fib(int f) {
  if (f < 2) return f;
  return fib(f - 1) + fib(f - 2);
}

کمپائل کرنے کے بعد ڈاؤن لوڈ کریں wasm فائل اور پھر اسے ہیکس سٹرنگ میں تبدیل کریں

python -c "print('data:hex,'+bytes.hex(open('program.wasm','rb').read()))"

اس کوڈ میں متغیر کے پیچھے موجود مواد کو تبدیل کریں

__تھریڈ ((فنکشن، دلائل...)

تھریڈ تخلیق کریں اور تھریڈ ٹائڈ کو واپس کریں ، قبول شدہ تھریڈ پرسنل فنکشن کی خصوصیات کو تھریڈ فنکشن کے اندر تمام فنکشن کوڈ کو مکمل کرنا ہوگا ، دوسرے بند فنکشن کے حوالوں کی حمایت نہیں کرتا ہے ، تھریڈ کے اندر پلیٹ فارم کے تمام APIs کو بلایا جاسکتا ہے ، لیکن صارف کے ذریعہ اپنی مرضی کے مطابق دیگر افعال کو نہیں بلایا جاسکتا ہے۔

ایک سادہ مثال:

let tid = __Thread(function(x, y) {
    return x + y
}, 1, 2)
Log(__threadJoin(tid))

ملٹی تھریڈ کی درخواستوں کی مثالیں:

function main() {
    let threads = [
        "https://www.baidu.com",
        "https://www.163.com"
    ].map(function(url) {
        return __Thread(function(url) {
            Log("GET", url)
            return HttpQuery(url)
        }, url)
    })
    threads.forEach(function(tid) {
        Log(__threadJoin(tid))
    })
}

تھریڈ کی مقامی اسٹوریج متغیر

تھریڈ میں مقامی اسٹوریج متغیرات کی حمایت کریں تاکہ ڈیٹا کو آسانی سے شیئر کیا جاسکے۔__threadJoinیا پھر آپ کو اس سے باہر نکلنے کا انتظار کرنا پڑے گا۔__threadTerminateختم ہونے کی صورت میں مؤثر

__threadGetData(tid, key)
__threadSetData(tid, key, value)

ٹائڈ 0 موجودہ تھریڈ کی نمائندگی کرتا ہے ، ویلیو غیر متعین شدہ حذف شدہ کلید کی نمائندگی کرتا ہے ، اور اس کی تائید کرتا ہے کہ تھریڈز کے مابین متغیرات کو باہمی طور پر رسائی حاصل کی جاسکتی ہے ، جس کی قدر کو ترتیب دینے کے قابل متغیر ہونا ضروری ہے۔

تار مواصلات

__threadPostMessage(tid, msg) // 向指定线程发送消息, tid为0是向主线程即当前主函数发送, 在线程内部调用指向主线程回复消息, 该消息可以被EventLoop捕获
__threadPeekMessage(tid, timeout) // 从指定线程接收消息, 如果不指定timeout(毫秒)就一直等待, tid为0指等待主线程的消息

__threadJoin ((وقت، ٹائم آؤٹ)

تھریڈ کے اختتام کا انتظار کریں timeout ((ملی سیکنڈ) کی وضاحت کریں مخصوص ٹائم آؤٹ کے لئے انتظار کریں یا تھریڈ کے اختتام تک انتظار کریں ، کامیابی کے ساتھ فنکشن کی واپسی کی قیمت پر مشتمل ایک ڈھانچہ واپس کریں اور وسائل کو بازیافت کریں ، ڈھانچہ مندرجہ ذیل ہے

{
    id: tid, // 线程id
    elapsed: 1111, // 线程的运行时间(纳秒)
    terminated: false, // 线程是否被强制结束 
    ret: 123, // 线程函数的返回值
}

اگر ٹائم آؤٹ undefined لوٹاتا ہے

__threadTerminate(tid) __threadTerminate (((tid)) __threadTerminate (((tid)) __threadTerminate (((tid))

تھریڈ کو زبردستی ختم کرنا اور وسائل کو دوبارہ حاصل کرنا ((__threadJoin کو ختم ہونے تک استعمال نہیں کیا جاسکتا)

توجہ

__thread کے افعال غیر افعال سے متعلق متغیرات کی حمایت نہیں کرتے ہیں (یہ الگ تھلگ ماحول کے لئے کام کرتا ہے) ، بیرونی متغیرات کا حوالہ دیتے ہوئے مرتب کرنے میں ناکام ہوجائیں گے


function main() {
    let cycle = 100
    let input = 30
    let threads = [
        __Thread(function(cycle, input) {
            function fib(f) {
                if (f < 2) return f
                return fib(f - 1) + fib(f - 2)
            }
            let ret = 0
            for (let i = 0; i < cycle; i++) {
                ret = fib(input);
                Log("javascript progress: ", i)
            }
            return 'javascript fib: ' + ret
        }, cycle, input),
        
        __Thread(function(cycle, input) {
            let data = 'data:hex,0061736d010000000186808080000160017f017f0382808080000100048480808000017000000583808080000100010681808080000007908080800002066d656d6f727902000366696200000aa480808000019e80808000000240200041024e0d0020000f0b2000417f6a10002000417e6a10006a0b'
            let m = wasm.parseModule(data)

            let instance = wasm.buildInstance(m, {
                stack_size: 65 * 1024 * 1024,
            })

            let ret = 0
            for (let i = 0; i < cycle; i++) {
                ret = instance.callFunction('fib', input)
                Log("wasm progress: ", i)
            }

            return 'wasm fib: ' + ret
        }, cycle, input)
    ]

    threads.forEach(function(tid) {
        let info = __threadJoin(tid)
        Log('#'+tid, info.ret, 'elapsed:', info.elapsed / 1e6, "#ff0000")
    })
}

متعلقہ

مزید

ہڈیوں کا چاقواشارہ: غلطی ReferenceError: '__Thread' is not defined at main (FILE:5)

ایجاد کنندہ کوانٹائزیشنتازہ ترین منتظم کو اپ گریڈ کریں