2012-07-14 30 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