2012-07-14 63 views
3

我一直在試圖減少我的應用程序的內存使用情況,並在分析後證明NSRegularExpression是一個相當大的內存豬。NSRegularExpression內存豬

我的一個fistMatchInString調用(第一個?)分配1 MB內存,永遠不會釋放。每次調用firstMatchInString都會泄漏一個「NSConcreteValue」(不管是什麼)。

你有沒有經歷同樣的行爲,你知道如何解決它嗎?你知道NSRegularExpression的好替代嗎?

之前你問:我所有的正則表達式模式是小的,並創建靜態。所有匹配的字符串都很小。

+0

取而代之的是NSRegularExpression,你可以選擇使用POSIX'' API,它具有手動內存管理並且更輕量。 – 2012-07-14 17:18:56

+0

謝謝,@ H2CO3。不幸的是我不能使用POSIX,因爲我需要Unicode支持。但是我找到了RegexKit:http://regexkit.sourceforge.net/#Latest,我打算試一試 – fishinear 2012-07-14 18:27:07

+0

POSIX *不支持Unicode。 – 2012-07-14 19:02:34

回答

1

是的,正則表達式是昂貴的操作。

根據NSPredicate編程指南,它說:「正則表達式匹配特別是一個昂貴的操作」,並且「你應該在正則表達式之前執行簡單的測試」。

我讓你看看​​的表現部分。我不知道,如果謂詞可以應用到你的情況,但你甚至可以提取性能部分一些有價值的信息(位於「使用謂語」一章)

編輯:

看的正則表達式的一部分這是link,他正在使用靜態NSRegularExpression而不是每次分配它。

從這個post,即使是關於python,「+」似乎更貪婪,所以可能會有一些改進,可以在你的正則表達式中,在表達式本身,一些最佳實踐中實現。

+1

感謝您的回覆,@ moxy。實際上,我認爲你引用的那一行是指NSPredicate內置的正則表達式,很可能是因爲他們需要編譯正則表達式模式。當NSRegularExpression預先編譯它時,匹配時應該快速使用O(n)。不過,我沒有看到性能部分的內存使用情況。唉,對於我簡單的字符串匹配來說,NSPredicate是一個巨大的矯枉過正。 – fishinear 2012-07-14 18:09:46

+0

增加了一些挖掘。 – moxy 2012-07-14 18:32:52