2013-04-04 44 views
30

Khi nào sử dụng Float32Array thay vì JavaScript chuẩn Array cho các ứng dụng trình duyệt?Khi nào sử dụng Float32Array thay vì Array trong JavaScript

Điều này performance test hiển thị Float32Array nói chung, chậm hơn - và nếu tôi hiểu chính xác một tiêu chuẩn Array lưu trữ số là 64bit - vì vậy không có lợi thế về độ chính xác.

Bên cạnh bất kỳ hit hiệu suất tốt, Float32Array cũng có những bất lợi của khả năng đọc - cần phải sử dụng một constructor:

a = new Float32Array(2); 
a[0] = 3.5; 
a[1] = 4.5; 

thay vì một mảng đen

a = [3.5, 4.5]; 

tôi yêu cầu này bởi vì tôi đang sử dụng thư viện glMatrix mặc định là Float32Array - và tự hỏi nếu có lý do gì tôi không nên ép buộc nó sử dụng Array thay vào đó sẽ cho phép tôi sử dụng mảng chữ.

+0

Tôi không thể tìm thấy bất kỳ trang web nào trả lời câu hỏi này, tôi đoán là lợi ích chính là sử dụng ít bộ nhớ hơn. Vì vậy, nếu bạn đang làm việc với các mảng điểm nổi lớn, nó có thể là một lợi ích. – Barmar

+0

Nó có thể là một cổng ngôn ngữ cho JavaScript và Float32Array là gần nhất với bất kỳ ngôn ngữ nguồn nào có sẵn. –

+2

[Thông số kỹ thuật mảng đã nhập] (http://www.khronos.org/registry/typedarray/specs/latest/) có thể giúp: "Đặc điểm kỹ thuật này cung cấp API cho khả năng tương tác với dữ liệu nhị phân gốc". – RobG

Trả lời

52

tôi gửi qua email nhà phát triển của glMatrix và câu trả lời của tôi dưới đây bao gồm ý kiến ​​của mình (điểm 2 & 3):

  1. Tạo một đối tượng mới thường nhanh hơn với Array hơn Float32Array là. Việc đạt được là đáng kể cho các mảng nhỏ, nhưng ít (phụ thuộc vào môi trường) với các mảng lớn hơn.

  2. Truy cập dữ liệu từ một TypedArray (ví dụ. Float32Array) thường nhanh hơn từ một mảng bình thường, điều đó có nghĩa rằng hầu hết các hoạt động mảng (ngoài việc tạo ra một đối tượng mới) là nhanh hơn với TypedArrays.

  3. Cũng như được nêu bởi @emidander, glMatrix được phát triển chủ yếu cho WebGL, yêu cầu các vectơ và ma trận đó được chuyển thành Float32Array. Vì vậy, đối với ứng dụng WebGL, việc chuyển đổi có khả năng tốn kém từ Array thành Float32Array sẽ cần được bao gồm trong bất kỳ phép đo hiệu suất nào.

Vì vậy, không ngạc nhiên, sự lựa chọn tốt nhất là ứng dụng phụ thuộc:

  • Nếu mảng nói chung là nhỏ, và/hoặc số hoạt động trên chúng là thấp do đó thời gian xây dựng là một đáng kể tỷ lệ tuổi thọ của mảng, sử dụng Array.

  • Nếu khả năng đọc mã cũng quan trọng như hiệu suất, sau đó sử dụng Array (ví dụ: sử dụng [], thay vì hàm tạo).

  • Nếu mảng rất lớn và/hoặc được sử dụng cho nhiều thao tác, hãy sử dụng TypedArray.

  • Đối với các ứng dụng WebGL (hoặc các ứng dụng khác có thể yêu cầu chuyển đổi loại), hãy sử dụng Float32Array (hoặc TypedArray khác).

+1

"lớn" và "nhỏ" là những mô tả rất mơ hồ thay đổi trong các ngữ cảnh khác nhau. Bất cứ ai có thể mở rộng một chút những gì được coi là một mảng "rất lớn" khi chúng ta nói về Float32Array vs những gì rất nhỏ? – yuvi

Các vấn đề liên quan