簡體   English   中英

'indexOf'方法性能優化

[英]'indexOf' method performance optimization

根據JavaScript是按引用傳遞還是按值傳遞語言? JavaScript按值傳遞字符串對象。 因此,調用indexOf方法將觸發復制內容。

就我而言,我正在解析一個大字符串以查找數據。 我大量使用indexOf查找數據。 字符串可以長達100-200KB,每次完整掃描我可能需要調用indexOf多達1000次。

恐怕這會導致不必要的復制字符串污染“內存”,並可能影響性能。

我的結論正確嗎? 如果是這樣,處理我的任務的正確方法是什么?

潛在地,我可以使用正則表達式,但此刻看起來復雜了。

字符串是Javascript中的一種奇怪的野獸,它們似乎位於原始類型和對象之間的中間地帶。 技術上講,它們被認為是原始的,但由於它們的不變性,在很多情況下都可以將它們視為參考。

鑒於它們不可變的,如果將字符串的副本傳遞給任何函數,我會感到非常驚訝,因為這既昂貴又完全不必要。

一種看似簡單的查找方法是將字符串傳遞給函數並更改其字符之一,以查看返回時是否反映在原始字符串中。 但是,如上所述,字符串的不變性使之成為不可能。


可能通過執行來測試此以間接的方式indexOf("a")中的許多百萬次的循環抗兩種串中的一個。

要搜索的字符串可以是"a""a very long string containing many thousands of characters ..."

如果字符串是通過引用傳遞的,則時間應該沒有明顯差異。 按值傳遞應該是可檢測的,因為您必須將字符串復制數百萬次,而短字符串的復制速度要比長字符串的復制速度快。

但是,正如我所說,由於引擎很可能已盡可能優化,因此可能沒有必要。

.indexOf()只是對字符串的搜索,只是將數字索引返回到字符串中。 無需進行復制,也不會進行復制。 這實際上與Javascript中的值/引用沒有任何關系。 該操作僅僅是返回索引的搜索。 根本不需要復制。

Javascript中的字符串是不可變的。 這意味着它們永遠無法更改,並且字符串中的這些索引始終指向字符串中的同一位置。 任何對字符串進行更改的操作都將返回新的字符串,而舊字符串將保留下來。

這允許在實現中進行一些有趣的優化。 因為字符串是不可變的,所以可以在所有引用它的代碼點之間共享它。 每當有人調用一個函數來修改字符串時,它都會簡單地返回一個新字符串對象,該對象是由舊對象加上修改后創建的。

如果.indexOf()的索引與.slice()或類似的東西一起使用,則將把原始字符串的一部分復制到新的字符串對象中(可能使用一些額外的內存)。

如果要自己進行測試,請隨意在大字符串上運行.indexOf()操作,並查看內存使用情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM