[英]Optimization of sorting and filtering array of objects
我有有效的代碼,並希望從中獲得更好的性能,因為如果傳遞更多的數據,它會被漂亮地加載。 但是我不知道該怎么辦。
輸入:帶有logUnits的數組,每個數組包含一個日志事件視圖,例如“ 2013-01-16 15:13:00 Hello”和時間數組-該數組僅包含我們有日志事件的時間(2013-01-02,2013 -01-09等)
輸出:視圖數組,其中每個視圖包含同一天的日志單位。
我還可能需要按事件類型過濾日志單元。
這是我的操作方式。
NSMutableArray *views = [[NSMutableArray alloc] initWithCapacity:times.count];
@autoreleasepool {
for(int x = 0; x != times.count; x++)
{
UIView *foo = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 400)];
foo.backgroundColor = [UIColor clearColor];
int f = 0;
int h = 0;
for(int i = 0; i != objectArray.count; i++)
{
@autoreleasepool
{
LogUnit *unit = [objectArray objectAtIndex:i];
if([[times objectAtIndex:x] isEqual:[unit realTime]])
{
if(![[foo subviews] containsObject:unit.view]) // Look if unit was already added
{
NSString *number = [NSString stringWithFormat:@"SortLog%i ",[[NSUserDefaults standardUserDefaults] stringForKey:@"ObjectNumber"].intValue];
NSString *comp = [[NSUserDefaults standardUserDefaults] stringForKey:number];
if([[unit status] isEqualToString:comp] || [comp isEqualToString:NULL] || comp == NULL)
{
if([unit getEvent] != NULL)
{
unit.view.frame = CGRectMake(unit.view.frame.origin.x, f * unit.view.frame.size.height + 30, unit.view.frame.size.width, unit.view.frame.size.height);
[foo addSubview:unit.view];
f++;
h = unit.view.frame.size.height * f;
}
}
}
}
}
}
foo.frame = CGRectMake(0,0, 320, h + 30 );
h = 0;
[views addObject:foo];
}
我猜這最糟糕的事情是一個循環,對於每個外部循環,我都必須重新運行所有logUnit。 但是不知道我還能怎么做。 也許有一種方法可以調用“選擇時間等於[單位實時]的單位”之類的方法嗎?
這里有一些危險信號。 懸念最少的是您正在掃描foo的所有子視圖中的unit.view,這是一個O(n)操作,這在最內層的循環中確實很麻煩。
接下來,如果您按時間對兩個數組進行排序,則實際上不必執行雙循環來查找大小相同的事件。 看看如何在合並排序中完成。
如果那還不夠好,請考慮在側線程上進行所有比較工作,並僅將add子視圖和視圖創建過程分派回主線程。 它至少會使它看起來更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.