2012-07-06 7 views
27

HTML 5 Công nhân web rất chậm khi sử dụng worker.postMessage trên một đối tượng JSON lớn. Tôi đang cố gắng tìm hiểu cách chuyển đối tượng JSON sang một nhân viên web - sử dụng các loại 'Đối tượng có thể chuyển' trong Chrome, để tăng tốc độ này.Công nhân Web - Đối tượng có thể chuyển giao cho JSON

Dưới đây là những gì tôi đang đề cập đến và dường như nó nên tốc độ này lên khá một chút: http://updates.html5rocks.com/2011/12/Transferable-Objects-Lightning-Fast

Tôi đang gặp khó khăn khi tìm một ví dụ tốt về điều này (và tôi không tin rằng tôi muốn sử dụng một ArrayBuffer). Bất kỳ trợ giúp sẽ được đánh giá cao.

Tôi đang tưởng tượng một cái gì đó như thế này:

worker = new Worker('workers.js'); 

var large_json = {}; 
for(var i = 0; i < 20000; ++i){ 
    large_json[i] = i; 
    large_json["test" + i] = "string"; 
}; 

//How to make this call to use Transfer Objects? Takes approx 2 seconds to serialize this for me currently. 
worker.webkitPostMessage(large_json); 
+4

Đây là nơi mà người lao động, trong vỏ bọc hiện tại của họ, rơi xuống, trong đó họ không có kết nối với kịch bản gốc, do đó bất cứ điều gì bạn muốn vượt qua cho họ liên quan đến một hoạt động sao chép mệt mỏi. Phương pháp "vượt qua bằng cách tham chiếu" của Webkit chắc chắn là cách để đi. Ngoài ra, hai điểm tấn công tôi: nếu bạn bị chậm trễ 2 giây, điều đó có thể đánh bại bất kỳ khoản tiết kiệm nào bạn có thể đạt được bằng cách sử dụng nhân viên web, vì vậy bạn cũng có thể tránh chúng và tuần tự hóa. 2) Làm thế nào về web SQL cho dữ liệu kích thước này - bất kỳ nhanh hơn? – Utkanos

+0

Tôi về cơ bản cần phải thao tác JSON và chuyển nó trở lại, vì vậy tôi không tin rằng web SQL sẽ hoạt động. Trong trường hợp bình thường của tôi, tôi sẽ không chuyển giao một đối tượng JSON lớn, nhưng tôi đã sử dụng nó cho mục đích thử nghiệm/trình diễn. Tôi * tin * từ những gì tôi đã đọc rằng các đối tượng chuyển nhượng sẽ làm cho nó một hoạt động vượt qua tham chiếu rất nhanh, dẫn đến một chuyển giao cực kỳ kịp thời, đến nay dưới 2 giây hiện tại. Tuy nhiên, tôi không thể tìm thấy bất kỳ ví dụ nào về cách thực sự làm điều đó. – kclem06

+0

"các loại phức tạp như Tệp, Blob, ArrayBuffer và các đối tượng JSON." - Xuất hiện nó phải được hỗ trợ: https://developer.mozilla.org/en/Using_web_workers – kclem06

Trả lời

0

Trong khi không sử dụng 'Đối tượng chuyển nhượng', nhưng điều này có thể giải quyết vấn đề của bạn.

Bạn cũng có thể thử tối ưu hóa biểu diễn dữ liệu của mình. Ví dụ: Ví dụ bạn mất ~ 1350ms để đóng gói/giải nén cho tôi (Google Chrome 19), nhưng các mã sau đây được thực hiện ~ 25 lần nhanh hơn (50ms):

console.time('json'); 
var a = [], test = []; 
for(var i = 0; i < 20000; ++i){ 
    a.push(i); 
    test.push("string"); 
}; 
var large_json = { 
    a: a.join(','), 
    test: test.join(',') 
}; 
large_json = JSON.parse(JSON.stringify(large_json)); 
large_json.a = large_json.a.split(","); 
large_json.test = large_json.test.split(","); 
console.timeEnd('json'); 
0

Ok tôi đã này tôi không biết nếu đó là tốt hay xấu , lý tưởng hoặc cách tồi tệ nhất để làm điều đó. Tôi vừa làm nó. trong hồ sơ nhân viên

var data = e.data; 
var string = String.fromCharCode.apply(null, new Uint16Array(data)); 
var objnow = JSON.parse(string); 

trong file html

function str2ab(str) { 
    var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char 
    var bufView = new Uint16Array(buf); 
    for (var i=0, strLen=str.length; i<strLen; i++) { 
    bufView[i] = str.charCodeAt(i); 
    } 
    return buf; 
} 
function stop() { 
var obj = {'cmd': 'stop', 'msg': 'Bye'}; 
var str= JSON.stringify(obj); 
var arbfr = str2ab(obj); 
worker.postMessage(arbfr,[arbfr]); 
} 

Và bây giờ nó hoạt động tôi có thể gửi đối tượng json, chuyển nhượng.

1

Sử dụng một đối tượng chuyển nhượng sẽ không giúp đỡ nếu bạn có để xây dựng nó từ đầu từ một mảng Json hiện (Đó là rất gần gũi với nhân bản ...)

đâu dữ liệu Json đến từ đâu? Một cách có thể để giữ tất cả công việc khó khăn trên luồng công nhân là lấy nó lấy dữ liệu bằng cách sử dụng XmlHttpRequest, chuyển đổi nó và gửi nó đến luồng giao diện người dùng. Bằng cách này, chi phí nhân bản cao xảy ra trên chuỗi công nhân và trong khi nó sẽ mất thời gian giống như trong chuỗi giao diện người dùng, nó sẽ không chặn ứng dụng của bạn.

+0

Yêu cầu I/O không chặn .... bao gồm Ajax – dman

+1

Thật vậy? Đó không phải là quan điểm của tôi – AlexG