2016-06-30 17 views
1

如果使用[containsObject:] vs使用[objectsPassingTest:block]幷包含停止變量集,檢查NSSet時檢查NSSet的速度是否存在差異是的,以便它在第一場比賽後停止?另外,如果集合包含自定義類的對象,我的理解是containsObject使用isEqual:方法來執行它的檢查,因此必須在自定義類中重寫。這是否會減慢containsObject檢查的速度,而不是NSSset包含Apple類的對象,如NSString,NSNumber等?使用objectsPassingTest檢查NSSet的速度之間的任何差異:vs containsObject:

我打算在我有一些時間的時候運行一些基準測試,但是明天要面試,希望得到那個答案。

+1

我投票結束這個問題作爲題外話,因爲這不是一個編程問題的問題。 – Avi

回答

0

那麼你應該運行你計劃的基準,但你可以猜測一個答案。

containsObject:的實現可能在每個成員上迭代調用isEqual:;而objectsPassingTest:的實現可能會迭代,調用每個成員上的塊,並且塊調用isEqual: ...

我認爲你可以基於此猜測。有一個很好的面試,但如果面試官讀取SO ...

0

即使我有這樣的Qs上的問題,所以我會(部分)回答它。我不認爲面試官會得到最終結果,但你的想法。

兩者都與-isEqual:做檢查。但-containsObject:可以直接執行,而-objectPassingTest:必須調用塊。這可能並不昂貴,但由於要執行的代碼並不昂貴,所以這可能會對性能造成影響。

在此旁邊-containsObject:可以使用散列查找對象。 -objectPassingTest:NSSet不能,因爲它不知道測試是什麼。塊也不能這樣做,因爲他一個接一個地獲取對象。但是,如果你在集合中有可變對象,通常自定義類的對象是什麼,不可以完成散列,因爲不可能在集合中的可變對象上實現有用的散列。

所以我的估計:具有正確實施-hash,-containsObject:的不可變對象將擊敗-objectPassingTest:到目前爲止,否則沒有那麼多。

相關問題