2010-07-10 2 views
4

Для обычного приложения вы никогда не захотите этого делать.Заставить iPhone имитировать выполнение задач с интенсивным использованием процессора?

Но ... Я создаю учебное приложение, чтобы показать людям, что происходит с различными моделями на разных устройствах iPhone и OS. OS 4 радикально изменила различные модели (IME: многие существующие коды НЕ РАБОТАЮТ при работе на OS 4).

Я пишу интерактивное тестовое приложение, которое позволяет запускать потоки для разных моделей (основной поток селектора, селекторный фон, nsoperationqueue и т. Д.) И посмотреть, что происходит с главным приложением GUI + во время его возникновения.

Но один из распространенных вариантов использования, который я хочу воспроизвести, это: «Thread, который выполняет загрузку backgorund, а затем анализирует результаты анализа с использованием процессора». Мы видим это в реальных приложениях.

Это не совсем тривиально; манера «быть занятой» имеет значение.

Итак ... как я могу имитировать это? Я ищу что-то, что гарантированно не отбрасывается оптимизирующим компилятором (или сейчас, или с лучшим компилятором), и этого достаточно, чтобы заставить поток работать с максимальным ЦП в течение примерно 5 секунд.

NB: в моих реальных приложениях я заметил, что есть некоторые странные вещи, которые происходят, когда поток iPhone занят - например. фоновые потоки будут голодать главным потоком EVEN WHEN, установленным с более низким приоритетом. Хотя это явно ошибка в планировщике потоков Apple, я бы хотел сделать занятый, который демонстрирует это - и/или альтернативный занятый, который показывает, что происходит, когда вы НЕ запускаете это поведение в планировщике.

UPDATE:

Например, следующее может иметь различные эффекты:

for(int i=0; i<1000; i++) 
    for(int k=0; k<1000; k++) 
    CC_MD5(cStr, strlen(cStr), result); 

for(int i=0; i<1000000; i++) 
    CC_MD5(cStr, strlen(cStr), result); 

... иногда, по крайней мере, компилятор, кажется, оптимизации последнего (и я не имею ни малейшего представления о компилятор вуду для этого - некоторые сборки не показали никакой разницы, некоторые это делали :()

UPDATE 2:

25 нитей, на первое поколение iPhone, делая millio n MD5 каждый ... и почти нет ощутимого влияния на графический интерфейс пользователя.

Принимая во внимание, что 5 потоков, анализирующих XML, с использованием синтаксического анализа на основе SAX, как правило, прерывают работу графического интерфейса.

Кажется, что MD5 хэши не вызывает проблем в iPhone глючный токарно-планировщиком :(. Я собираюсь исследовать MEM распределения вместо этого, увидеть, если это имеет различный эффект.

+1

Вы только что сказали это сами, вы хотите смоделировать «Thread, который выполняет загрузку backgorund, а затем анализирует результаты с использованием процессора». Почему бы вам не сделать это? скачайте кучу случайных файлов и примените на нем процедуру обработки (например, md5), но используйте как 100 потоков. – 5ound

+0

@ 5ound Это должен быть ответ .. вы бы получили мой +1, если бы это было так. Никто не должен требовать, чтобы код был создан для себя без какой-либо работы. Вашей идеи достаточно для ответа. – Jann

+0

Jann - он не работает (я не думаю, что это так просто). Теория этого тривиальна, но практика - это то, что меня толкает :) – Adam

ответ

1

Вы можете избежать компилятор оптимизирует вещи прочь, убедившись, что компилятор не может легко вывести, что вы пытаетесь сделать во время компиляции

Например, это:.

for(int i=0; i<1000000; i++) 
    CC_MD5(cStr, strlen(cStr), result); 

имеет инвариантное вход, поэтому компилятор может понять, что он получит са я результат каждый раз. Или что результат не используется, поэтому его не нужно вычислять. Вы могли бы избежать оба этих проблем, как так:

for(int i=0; i<1000000; i++) 
{ 
    CC_MD5(cStr, strlen(cStr), result); 
    sprintf(cStr, "%02x%02x", result[0], result[1]); 
} 

Если вы видите эту проблему с помощью SAX, то я хотел бы начать с получением потоков в приложении моделирования делает SAX и проверить вы видите те же проблемы вне вашего основного приложения.

Если проблема не связана с чистой мощностью процессора или распределением памяти, другие области, на которые вы могли бы смотреть, были бы дисковыми вводами/выводами (в зависимости от того, откуда поступает ваш вход xml), мьютексами или вызывающими селекторами/делегатами.

Удачи, и сообщите, как вы справляетесь!

+0

Да, это хорошая идея, спасибо. Я попробую шунтирование, перевернувшее их на чередующихся циклах, и nslog'ing после цикла, чтобы даже оптимизировать агрессивный компилятор. – Adam

1

Apple фактически предоставляет пример кода, который делает что-то похожее на то, что вы ищете на developer.apple.com, с целью подчеркнуть различия в производительности между использованием LibXML (SAX) и CocoaXML. Основное внимание уделяется не производительности процессора, но при условии, что вы можете реально измерить использование процессора, скорее всего, вы можете просто увеличить (повторите в своем xml) набор данных, который загружает образец.

+0

Я не заметил этого примера раньше - отличная находка, спасибо! – Adam

Смежные вопросы