Helpex - Trao đổi & giúp đỡ Đăng nhập
46

Mọi người có ý gì khi họ nói cái này đắt? Tôi tạo các phiên bản của rất nhiều đối tượng tạm thời chỉ để lưu trữ trung gian (NSString và NSDate là những đối tượng điển hình). Làm cách nào để biết liệu chương trình của tôi có sử dụng NSDateFormatter quá mức hay không?

Cho đến bây giờ, tôi có xu hướng tạo số tiền bằng một singleton, nhưng sở thích của tôi là gói nó vào một số đối tượng khác mà nó được liên kết để tôi có thể sử dụng tự tham chiếu.

Không còn thời gian chạy các bài kiểm tra hiệu suất, tôi đang tìm cách hiểu rõ hơn về "quy tắc ngón tay cái" về lý do tại sao tôi nên hoặc không nên làm điều này.

46 hữu ích 1 bình luận 9.0k xem chia sẻ
40

Khi điều gì đó như thế này được coi là đắt tiền, nó không nhất thiết có nghĩa là bạn không bao giờ nên làm nó, nó chỉ có nghĩa là tránh làm nó trong những tình huống khi bạn cần thoát ra khỏi một phương pháp càng nhanh càng tốt. Ví dụ, khi iPhone 3G là thiết bị mới nhất, tôi đang viết một ứng dụng với UITableViewsố được định dạng để hiển thị trong mỗi ô (tôi có thể nói thêm, điều này đã trở lại khi tôi là người mới bắt đầu phát triển iOS). Nỗ lực đầu tiên của tôi là:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSString *reuseIdentifier = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier forIndexPath:indexPath];

    MyManagedObject *managedObject = [self.managedObjects objectAtIndex:indexPath.row];
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];

    [cell.textLabel setText:[managedObject title]];
    [cell.detailTextLabel setText:[numberFormatter stringFromNumber:[managedObject amount]]];

    return cell;
}

Hiệu suất cuộn của mã này rất tệ. Tốc độ khung hình giảm xuống khoảng 15 FPS vì tôi đang phân bổ một cái mới NSNumberFormattermỗi khi tableView:cellForRowAtIndexPath:bị đánh.

Tôi đã sửa nó bằng cách thay đổi mã thành này:

- (NSNumberFormatter *)numberFormatter {

    if (_numberFormatter != nil) {
        return _numberFormatter;
    }

    _numberFormatter = [[NSNumberFormatter alloc] init];
    [_numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];

    return _numberFormatter;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSString *reuseIdentifier = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier forIndexPath:indexPath];

    MyManagedObject *managedObject = [self.managedObjects objectAtIndex:indexPath.row];
    NSNumberFormatter *numberFormatter = [self numberFormatter];

    [cell.textLabel setText:[managedObject title]];
    [cell.detailTextLabel setText:[numberFormatter stringFromNumber:[managedObject amount]]];

    return cell;
}

Sự khác biệt ở đây là tôi đã tải một cách lười biếng NSNumberFormattervào một ivar, để mỗi lần chạy tableView:cellForRowAtIndexPath:không còn phân bổ một phiên bản mới. Thay đổi đơn giản này đã đẩy hiệu suất cuộn lên khoảng 60 FPS.

Ví dụ cụ thể này không còn phù hợp nữa, vì các chip mới hơn có khả năng xử lý phân bổ mà không ảnh hưởng đến hiệu suất cuộn, nhưng tốt hơn hết là hiệu quả nhất có thể.

40 hữu ích 4 bình luận chia sẻ
8

Tôi đã có cùng một câu hỏi này một thời gian trước đây. Tôi đã chạy Instruments trên một số ứng dụng mà tôi đang làm việc và tôi phát hiện ra các nhà phát triển trước đó đang tạo một NSDateFormatter mới cho mỗi nhật ký tùy chỉnh mà họ đã làm. Vì đối với mỗi màn hình, họ thường đăng nhập khoảng 3 dòng. Ứng dụng đã từng dành khoảng một giây chỉ để tạo NSDateFormatters.

Giải pháp đơn giản sẽ là giữ lại thể hiện định dạng ngày tháng trong lớp của bạn dưới dạng một thuộc tính hoặc một cái gì đó và sử dụng lại nó cho mỗi dòng nhật ký.

Sau một số suy nghĩ tầm thường, tôi đã đến với một "nhà máy" để xử lý việc tái sử dụng NSDateFormatters dựa trên định dạng và ngôn ngữ muốn. Tôi yêu cầu một bộ định dạng ngày của một số định dạng và ngôn ngữ và lớp của tôi cung cấp bộ định dạng đã được tải cho tôi. Điều chỉnh hiệu suất tốt, bạn nên thử.

Tái bút: Có lẽ ai đó muốn kiểm tra nó, vì vậy tôi đã công khai nó: https://github.com/DougFischer/DFDateFormatterFactory/blob/master/README.md

8 hữu ích 3 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ ios nsdateformatter , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading