Я очень новичок в Cocoa, и это, вероятно, полный вопрос новичка. Однако я до смерти разочарован.
У меня есть чрезвычайно простое приложение Cocoa (называемое «строками») для проверки отправки 1000 строк текста в текстовое представление.
Я начал в Xcode 4 с «нового проекта Какао» со всеми значениями по умолчанию. Это дает пустой объект окна, на который я могу перетащить элементы пользовательского интерфейса IB.
Пользовательский интерфейс, который я затем сконструировал, состоит из текстового представления и кнопки в окне файла NIB. Я использую Xcode 4, чтобы перетащить эти два элемента в файл .h. Текстовое представление подключено к outView
, а кнопка «1000» подключена к методу one_thousand_button
.
Нажатие кнопки «1000» запускает цикл для печати 1000 строк текста («строка 1 \ n» «строка 2 \ n» ... «строка 1000») в NSTextView под названием «outView»
Здесь - это весь код (кроме описанного файла .XIB):
строкAppDelegate.h:
#import <Cocoa/Cocoa.h>
@interface linesAppDelegate : NSObject <NSApplicationDelegate> {
@private
NSWindow *window;
NSTextView *outView;
}
@property (assign) IBOutlet NSWindow *window;
@property (assign) IBOutlet NSTextView *outView;
- (IBAction)one_thousand_button:(id)sender;
@end
строкAppDelegate.m:
#import "linesAppDelegate.h"
@implementation linesAppDelegate
@synthesize window;
@synthesize outView;
- (IBAction)one_thousand_button:(id)sender {
NSString* oldString;
NSString* newString;
for(int i=1; i<=1000; i++){
oldString = [outView string];
newString = [oldString stringByAppendingString:
[NSString stringWithFormat: @"Line %i\n",i]];
[outView setString: newString];
}
}
@end
Это ДЕЙСТВИТЕЛЬНО МЕДЛЕННО выполняется. Возможно, 7 секунд в первый раз и все медленнее с каждым нажатием «1000».Даже есть крутящаяся красочная пицца смерти!
Я понимаю, что это, вероятно, неправильный способ заполнить NSTextView 1000 строк текста и что цикл, который считывает содержимое текстового представления и добавляет его с помощью метода stringByAppendingString
, является узким местом.
Каков же альтернативный метод?
Результат
Я обернул этот код:
mach_timebase_info_data_t info;
mach_timebase_info(&info);
uint64_t start = mach_absolute_time();
// timed code
uint64_t duration = mach_absolute_time() - start;
duration *= info.numer;
duration /= info.denom;
duration /= 1000000;
NSLog(@"timed code took %lld milliseconds!", duration);
вокруг кода из Адама Пребла , моего оригинала, и drewk :
Adam Preble (Adam, base) drewk my pitiful code
1st run: 3ms 269ms 260ms 1,950ms
2nd run 3ms 269ms 250ms 2,332ms
3rd run: 2ms 270ms 260ms 2,880ms
При первом запуске добавляется 1000 строк; 2-й прогон добавляет еще 1000 строк и т. Д. (Адам, база) - это его код без beginEditing
и endEditing
Понятно, что использование beginEditing
и endEditing
НАМНОГО быстрее!
См. Документы Apple по Синхронизация редактирования .