Действительно ли оптимизация кода в TI-BASIC имеет значение?

Я знаю, что в TI-BASIC принято одержимо оптимизировать и сохранять как можно больше битов (признаю, что это довольно весело).

Например,

DelVar Z
Prompt X
If X=0
Then
    Disp "X is zero"
End                   //28 bytes

будет очищен как

DelVar ZPrompt X
If not(X
    "X is zero        //20 bytes

Но действительно ли такая оптимизация кода имеет значение? Он заметно быстрее работает или экономит память?


person user3932000    schedule 11.10.2016    source источник
comment
Совет: в разделе кода очистки вы можете удалить Disp из последней строки. Все, что оценивается (устанавливается в Ans) в последней строке программы TI-Basic, отображается неявно. (Если в последней строке не установлено значение Ans, вместо него отображается Done).   -  person Timtech    schedule 12.10.2016
comment
@Timtech Я этого не знал, спасибо! Отредактировано сейчас.   -  person user3932000    schedule 12.10.2016
comment
Даже если это сэкономит время выполнения, вы потеряете все это сэкономленное время, пытаясь понять, что делает программа, когда вы попытаетесь изменить ее позже. Даже на TI-Basic в большинстве случаев лучше писать для людей.   -  person Vaelus    schedule 17.02.2017
comment
@Vaelus Я пишу свои собственные программы и пишу для себя, поэтому читабельность не нужна. Кроме того, TI-84 ОЧЕНЬ медленный, и мне нужно экономить все время, которое я могу получить.   -  person user3932000    schedule 17.02.2017


Ответы (3)


Да. Оптимизация кода TI-Basic имеет значение, и эта разница намного больше, чем для большинства языков программирования.

На мой взгляд, самая важная оптимизация программ TI-Basic — это размер (сделать их как можно меньше). Это важно для меня, так как у меня есть десятки программ на моем калькуляторе, который имеет только 24 КБ доступной для пользователя оперативной памяти. В этом случае нет необходимости тратить много времени, пытаясь сэкономить несколько байтов места; вместо этого я просто советую изучать самые короткие и эффективные способы выполнения действий, чтобы при написании программ они, естественно, были небольшими.

Кроме того, программы TI-Basic должны быть оптимизированы для скорости. Примеры, которые приходят мне в голову, включают причуду с незамкнутым циклом For(, вычисление значения один раз вместо его вычисления на каждой итерации цикла (если возможно) и использование быстродоступных переменных, таких как Ans и финансовые переменные всякий раз, когда к переменной необходимо обращаться большое количество раз (например, 1000+).

Третья возможная оптимизация касается использования оперативной памяти. Каждый цикл, вызов функции и т. д. имеют служебные данные, которые должны храниться в стеке памяти, чтобы вернуться в исходное местоположение, вычислить значения и т. д. во время выполнения программы. Важно избегать утечек памяти (например, выхода из цикла с помощью Goto).

Вам решать, как сбалансировать эти оптимизации. Я предпочитаю:

  1. Прежде всего, убедитесь, что в моей программе нет утечек памяти или неправильно вложенных циклов.
  2. Воспользуйтесь преимуществами любых оптимизаций размера, которые практически не влияют на скорость работы программы.
  3. Подумайте об оптимизации скорости и решите, стоит ли дополнительная скорость увеличения размера программы.
person Timtech    schedule 12.10.2016

TI-BASIC — это интерпретируемый язык, что обычно означает огромные накладные расходы на каждую операцию.

Принцип работы интерпретируемого языка заключается в том, что вместо фактической компиляции программы в код, который выполняется непосредственно на ЦП, каждая операция представляет собой вызов функции интерпретатора, который смотрит, что нужно сделать, а затем вызывает функции для выполнения этих подзадач. В большинстве случаев накладные расходы в два раза связаны со скоростью, а часто также и с использованием памяти стека. Тем не менее, память для нестека обычно одинакова.

В приведенном выше примере вы выполняете точно такое же количество операций, что должно означать, что они выполняются точно так же быстро. Что вам следует оптимизировать, так это такие вещи, как i = i + 1, что составляет 4 операции, в i++, что составляет 2 операции. (например, TI-BASIC не поддерживает оператор ++).

Это не означает, что все операции занимают одно и то же время, внутренне операция может вызывать сотни других функций или может быть такой же простой, как обновление одной переменной. Программисты интерпретатора, возможно, также внедрили различные оптимизации глазка, которые оптимизируют очень специфические языковые конструкции, например. for(int i = 0; i < count; i++) может быть реализован как набор дорогостоящих функций-интерпретаторов, которые ведут себя так, как если бы i был универсальным, или его можно было бы оптимизировать для скомпилированного цикла, в котором нужно было просто обновить переменную i и переоценить count.

Так вот, не все интерпретируемые языки обречены на это бледное существование. Например, JavaScript раньше был одним, но в наши дни все основные js-движки JIT компилируют код для запуска непосредственно на ЦП.

ОБНОВЛЕНИЕ: уточнено, что не все операции одинаковы.

person Cine    schedule 12.10.2016
comment
Но это не так, есть огромные различия в производительности команд, это не так, как 1 команда = 1 единица времени. Пример: goto медленный (и может вызвать утечку памяти), характеристики производительности if зависят от того, есть ли после него then, IS>( медленнее, чем обычно (но существует!), но если вы можете использовать встроенный пропуск, это быстрее, чем эквивалентное приращение +if. - person harold; 12.10.2016
comment
В дополнение к тому, что сказал @harold, в TI-BASIC есть некоторые странные особенности, такие как цикл For(, работающий намного медленнее в определенных случаях (например, когда следующий оператор If без Then является ложным), если нет закрывающей скобки. - person user3932000; 12.10.2016

Абсолютно, это имеет значение. Я написал полномасштабную цветную RPG для TI-84+CSE, и позвольте мне сказать вам, что без оптимизации моего кода игра просто не запустится. В настоящее время на CSE Sorcery of Uvutu может работать только в том случае, если все остальные программы заархивированы, а во всей остальной памяти нет оперативной памяти. Хранилище программ и данных отдельно занимает 20 КБ в ОЗУ или всего 1 КБ из всей доступной пользовательской памяти. Со всеми используемыми переменными память приближается к опасно низкой отметке. У меня были моменты в моей разработке, когда из-за плохой оптимизации я даже не мог запустить игру, не получая ошибки «память вся потеряна». У меня были планы реализовать различные дополнительные вещи, но из-за проблем с местом и скоростью это было невозможно сделать. Это только рассмотрение пространства.

Что касается скорости, то игра стала и остается медленной в обычном мире. Передвижение по внешнему миру мучительно медленное по сравнению с другими играми, и это из-за того, что я должен делать в этом коде; Я должен проверить наличие столкновений, проверить, переходит ли пользователь на новую карту, проверить, нажал ли он клавишу, которая должна вызвать ответ, проверить, должна ли продолжаться битва, и многое другое. Я смог немного оптимизировать скорость ходьбы, но даже тогда я мог открыто сказать, что сделал улучшения. Он по-прежнему был ужасно медленным (по крайней мере, по сравнению с любым другим портом, который я сделал), но я сделал его немного более терпимым.

Подводя итог, исходя из собственного опыта создания большого проекта, я могу сказать, что в TI-Basic оптимизация кода действительно имеет значение. В других ответах упоминалось об этом, но TI-Basic - это интерпретируемый язык. Это означает, что код не компилируется в более быстрый код более низкого уровня, но то, что вы добавляете в программу, считывается прямо по мере ее выполнения, интерпретируется интерпретатором, вызывает подпрограммы и другие вещи, необходимые для выполнения программы. команды, а затем возвращается, чтобы прочитать следующую строку. В результате этого, а также того факта, что ЦП серии TI-84+, Zilog Z80, был разработан в 1976 году, вы получаете довольно медленный интерпретатор, особенно для нашего времени. Таким образом, чем меньше команд вы запускаете и чем больше вы пользуетесь системными странностями, такими как Ans, являющейся самой быстрой переменной, которая также может содержать большинство типов данных (целые/плавающие числа, строки, списки, матрицы и т. д.), лучше производительность вы собираетесь получить.

Источники: мой собственный опыт, задокументированный здесь: https://codewalr.us/index.php?topic=778.msg27190#msg27190

Номера оперативной памяти TI-84+CSE взяты отсюда: https://education.ti.com/en/products/calculators/graphing-calculators/ti-84-plus-c-se?category=specifications

Информация о Z80 взята отсюда: http://segaretro.org/Zilog_Z80

person Stephen P    schedule 19.09.2017