gpt4 book ai didi

ios - 针对 iOS 的 Objective-C 方法优化性能

转载 作者:行者123 更新时间:2023-11-28 19:12:19 24 4
gpt4 key购买 nike

我有这样的方法,但很难优化它以使其运行得更好。在 NSLog(@"Debug2")NSLog(@"Debug3") 之间到达 100 个单元大约需要 1 秒和 4 次。在 iPhone 上为 2 秒。单位越多,需要的就越多。 250 个单位和 5 倍,在 Mac 上需要 1.7 秒,在 iphone 上需要 3.2 秒。

我认为性能不在于循环中的循环。由于 250 * 5 = 1250,计算机处理速度应该不会太大。

方法思路:

输入:NSMutableArray 时间 - 包含时间(2012-12-12、2013-01-19)等 NSMutableArray objectArray - 包含 LogUnit 对象。输出:计算 View 数组。

主要思想:每个时间与 ObjectArray 中时间相同的对象的 View 。

我通过显示一小部分对象(请参阅代码中的 counted_breakPlease)使其速度更快,但它仍然不够快。

- (NSMutableArray*) sortViews: (NSMutableArray *)times and:(NSMutableArray *)objectArray
{
NSLog(@"debug2");
NSMutableArray *views = [[NSMutableArray alloc] initWithCapacity:times.count];

NSString *number = [NSString stringWithFormat:@"SortLog%i ",[[NSUserDefaults standardUserDefaults] stringForKey:@"ObjectNumber"].intValue];

NSString *comp = [[NSUserDefaults standardUserDefaults] stringForKey:number];

LogUnit *unit;

int counted = 0;
for(int x = 0; x != times.count; x++)
{
@autoreleasepool {

UIView *foo = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 400)];
foo.backgroundColor = [UIColor clearColor];

int f = 0;
int h = 0;

NSString *attributeName = @"realTime";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K IN %@", attributeName, [times objectAtIndex:x]];
// Filter the objectArray by the time, so we don't have to run through all the objects in objectArray, and check if time is right.
NSArray *filtered = [objectArray filteredArrayUsingPredicate:predicate];

for(int i = 0; i != filtered.count; i++)
{
unit = [filtered objectAtIndex:i];

// Filter units by user choice (comp). Like comp = Warnings or comp = Errors and etc.
if([[unit status] isEqualToString:comp] || [comp isEqualToString:NULL] || comp == NULL)
{
// testing if the unit is correct to use
if([unit getEvent] != NULL)
{
// below is some computation for frames, to get them to proper position
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];
counted++;
f++;
h = unit.view.frame.size.height * f;
}
}
}

UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 30)];
myLabel.backgroundColor = [UIColor clearColor];
myLabel.font = [UIFont boldSystemFontOfSize:20];
myLabel.textColor = [UIColor colorWithRed:88 green:154 blue:251 alpha:1];
myLabel.textAlignment = UITextAlignmentCenter;
myLabel.text = [times objectAtIndex:x];
// Just adding a label with "2012-12-30" or etc on top of the view.
[foo addSubview:myLabel];

foo.frame = CGRectMake(0,0, 320, h + 30 );
h = 0;
[views addObject:foo];

// counting added views for performance, if more than 30, return, and show only small portion of whole units, user has the option to show all the units if he wants to, but that takes a time to load..
if(counted > 30 && filtered.count != counted)
{
if(_breakPlease == false)
{
_broken = true;
break;
}
}
}
}
NSLog(@"debug3");
return views;
}

最佳答案

有几件事供您尝试。

首先进行分析:

  • 试用 Instruments 中的性能分析器;
  • 如果您对探查器有一些不满,那么请尝试获取代码每个部分的中值时间。

现在进行优化:

  • 避免在循环中创建完全相同的对象。尝试创建示例对象,然后重用或复制它们;
    • 创建一个示例 UIView 并将其存档,并在您需要新 View 时取消存档。也将此应用到 UILabel;
    • 虽然我从未使用过它,但有一种方法可以创建 NSPredicate 并在以后应用一些值。这样你就可以重用相同的 UIPredicate;
    • 将您需要的颜色也保存在变量中,而不是询问 UIColor,因为我们不知道 UIColor 是如何处理它的;
  • 你能否将你的内部 for 循环短路,即你有最大数量的正确单元?

好吧,分析器应该足以让您了解您的瓶颈在哪里,但我也给了您一些想法。

不要忘记在这里报告结果! :)

关于ios - 针对 iOS 的 Objective-C 方法优化性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14620575/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com