Мое приложение для iPhone получит удар производительности, если я буду использовать Objective C для низкоуровневого кода?

Вы можете использовать @propery Python. Он работает как геттер, как и другие языки, такие как C # и JAVA.

В вашем случае вы можете сделать объект, подобный объекту ((i, j), (notEqual(A[i], A[j]))), с помощью геттера.

См. Пример реализации ниже

class bigListElement(object):
    A = [] # this is static
    def __init__(self, index_tuple, areEqual):
        self.index_tuple = index_tuple
        self._areEqual = areEqual

    @staticmethod
    def notEqual(a, b):
        if a is None and b is None:
            return True
        if a != b:
            return True
        return False

    @property
    def areEqual(self):
        return bigListElement.notEqual(bigListElement.A[self.index_tuple[0]], bigListElement.A[self.index_tuple[1]])


print("Hello World")

bigListElement.A = [10, 2, 10, 3, 4]
a = bigListElement((0, 1), False)

print(a.areEqual) # True

bigListElement.A[1] = 10

print(a.areEqual) # False
68
задан Community 23 May 2017 в 11:45
поделиться

4 ответа

Майк Эш в своем сообщении «Сравнение производительности общих операций» приводит некоторые точные цифры производительности различных вызовов методов Objective-C по сравнению с C и C ++. Также это сообщение by Savoy Software - интересное чтение, когда дело доходит до настройки производительности приложения iPhone с помощью Objective-C ++.

Я предпочитаю чистый, описательный синтаксис Objective-C над Objective-C ++, и не нашел сам язык стал источником моих узких мест в производительности. Я даже склонен делать вещи, которые, как я знаю, приносят в жертву немного производительности, если они делают мой код более удобным в сопровождении.

58
ответ дан 24 November 2019 в 14:10
поделиться

В этом исследовании говорится, что для того, чтобы действительно получить производительность в игре, интенсивно использующей процессор, вы должны использовать C. Связанная статья содержит проект XCode, который вы можете запустить.

Я считаю, что суть в такова: используйте Objective-C, где вы должны взаимодействовать с функциями iPhone (в конце концов, размещение батутов повсюду не может быть полезным для всех ), но когда дело доходит до циклов, таких вещей, как классы векторных объектов или интенсивный доступ к массивам, придерживайтесь массивов C ++ STL или C, чтобы получить хорошую производительность.

Я имею в виду, было бы совершенно глупо видеть position = [[Vector3 alloc] init] ;. Вы просто запрашиваете снижение производительности, если используете счетчик ссылок на базовые объекты, такие как вектор позиции.

1
ответ дан Community 24 November 2019 в 14:10
поделиться

Очень сложно собрать «достоверные данные», чтобы не вводить в заблуждение.

Самая большая проблема при проведении сравнения функций, как вы предлагаете, заключается в том, что эти два языка поддерживают очень разные стили кодирования. Objective-C - это динамический язык с утиной типизацией, где типичное использование C ++ является статическим. Одна и та же проблема объектно-ориентированной архитектуры, вероятно, будет иметь совершенно разные идеальные решения с использованием C ++ или Objective-C.

Мое мнение (поскольку я много программировал на обоих языках, в основном для больших проектов): чтобы максимизировать производительность Objective-C, он должен быть написан очень близко к C. В то время как с C ++ можно гораздо больше использовать язык без какого-либо ущерба производительности по сравнению с C.

Какой из них лучше? Я не знаю. Для чистой производительности C ++ всегда будет иметь преимущество. Но стиль ООП Objective-C определенно имеет свои достоинства. Я определенно думаю, что с ним легче сохранить разумную архитектуру.

31
ответ дан 24 November 2019 в 14:10
поделиться

У меня нет жестких данных для объективных C, но у меня есть хорошее место для поиска C ++.

C ++ начался в соответствии с C с классами, в соответствии с Bjarne Strousrup в его отражении в первые годы C ++ ( http://www2.research.att.com/~bs/hopr2.pdf ), так C ++ можно продумать (например, объективную C) как нажатие C до его пределов для объектной ориентации.

Каковы эти ограничения? В период сроки 1994-1997 годов многие исследователи выяснили, что объектно-ориентация пришла по стоимости из-за динамического связывания, например, Когда функции C ++ отмечены виртуальными, и могут быть / могут быть не детские классы, которые переопределяют эти функции. (В Java и C # все функции ожидают, что CTOR по своей природе виртуальны, и там нельзя многое сделать с этим.) В «изучении методов девиртоализации для Java Rest-Time Compiler» от исследователей в IBM Research Tokyo, Они контрастируют методы, используемые для решения этого, включая один из URZ Hölzle и Gerald Aigner. URZ Hölzle, в отдельной статье с Карелом Дриссеном, показал, что в среднем 5,7% времени в программах C ++ (и до ~ 50%) было потрачено на вызов виртуальных функциях (например, VTTable + Thunks). Позже он работал с каким-то MallTalk Resiararchers в том, что в конечном итоге Джава Hotspot VM решает эти проблемы в OO. Некоторые из этих функций придумываются в C ++ (E.g. «Защищенные» и обработка исключений).

Как я уже упоминал, C ++ является статическим набранным, где цель C является набравшей уткой. Разница в производительности в исполнении (но не строк кода), вероятно, является результатом этой разницы.

3
ответ дан 24 November 2019 в 14:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: