2015-01-21 19 views
6

io.js的第一個版本已在本月出版,當時我在閱讀文檔時發現smalloc是在io.js中引入的新模塊。在io.js中使用smalloc

直到今天,我從來沒有覺得有必要在JavaScript中這樣做。

我的問題是:

  1. 我不知道是否有真正使用smalloc在 javscript需要原始內存分配的?

  2. 如果需要,那麼爲什麼?如何使用smalloc

  3. 如果不是那麼爲什麼io.js會員添加這個模塊?

它還說

有可能是指定您希望外部陣列的數據類型。所有可能的選項都在smalloc.Types中列出。

用法示例:

var doubleArr = smalloc.alloc(3, smalloc.Types.Double); 

,這裏是支持的分配類型列表

smalloc.Types# 

Int8 
Uint8 
Int16 
Uint16 
Int32 
Uint32 
Float 
Double 
Uint8Clamped 
  • 我們試圖做的javascript strongly typed language
  • 所有的

    回答

    8

    首先,緩衝區由SMALLOC模塊的支持,也不會被io.js開發者加入這個模塊,它node 0.11分公司發起,io.js剛剛導入它。原始內存分配意味着更低級別的內存操作,因此 - 更快的操作,更好的性能,這是node.jsio.js的目標。因此,如果您需要在二進制世界中實現某些內容而不侷限於當前的緩衝區API,則應該使用smalloc創建自己的方法來操縱內存。正如文檔所說:

    這可以用來創建自己的類似Buffer的類。沒有設置其他屬性,所以用戶需要跟蹤其他必要的信息(例如分配的長度)。

    而且,這不是一個嘗試,使JavaScript的強類型語言,這僅僅是內存的操作,它不能被其他方式確保更高的性能來完成。

    +0

    這是mallocs在c中做了什麼?我們是否需要在javascript beforre中使用它?沒有!!爲什麼現在呢? – 2015-01-21 12:48:43

    +1

    @NaeemShaikh,它只是幫助創建緩衝區的模塊,如果你需要創建類似緩衝區的類來使用它,如果沒有的話 - 只需通過,你不必強迫使用它,每次你使用緩衝區時,你使用smalloc。 – micnic 2015-01-21 12:56:40

    7

    感謝@micnic回答這個問題。我想提供一些關於爲什麼我實施smalloc的補充信息。

    不要以爲原始內存分配在JS是一些奇怪的新事物。它與Typed Arrays使用的機制類型相同。所以,在任何你可以使用Typed Array的地方,你也可以使用smalloc。 smalloc的優勢在於它不會爲您定義任何內容。允許您的API具有最大的靈活性。這也是安全的,因爲當物體不再被使用時,GC將清理你的分配。

    一種用法是針對數學庫。特別是如果編寫本地模塊。我個人使用它來進行棘手的性能優化,在對象上分配內存,然後在JS和C++之間共享該內存以啓用兩者之間的共享狀態。這是迄今爲止最快的方式,並且導致Node和io.js中的一些令人印象深刻的優化。

    請記住,您可以分配到現有的對象。這是權力所在。例如:

    function Alloc(n) { 
        n >>>= 0; // uint32 conversion 
        this.length = n; 
        smalloc.alloc(n, this); 
    } 
    
    var a = new Alloc(16); 
    

    有一個簡單的新的結構,只是分配一個Uint8外部數據數組到實例。

    我會很快重申,問題的答案:

    1. 我不知道是否有真正需要使用SMALLOC在javscript原始內存分配的?

    是的。認爲鍵入數組。

    1. 如果需要,那麼爲什麼?

    回答上面。此外,搜索任何使用Typed Arrays的東西。

    1. 使用smalloc的用例是什麼?

    回答上面。此外,開發人員還爲此找到了許多其他用途。

    1. 如果不是那麼爲什麼io.js會員添加這個模塊?

    在io.js出現之前很久,我就寫了它。 :)

    1. 我們是否試圖讓JavaScript成爲強類型語言?

    絕對沒有。這兩者甚至沒有關係。

    UPDATE:由於V8 V4.4即將打破的變化,smalloc已被標記爲 「過時」 的io.js V2開始。