Kagon

Пользователь

Регистрация: 14.03.2017

Сообщения: 12770

Рейтинг: 7256

Kagon

Регистрация: 14.03.2017

Сообщения: 12770

Рейтинг: 7256

Препод по информатике рассказывал про методы оптимизации, и упомянул странный но любопытный как по мне метод, касающийся кастов типа массива. Привел такой код в пример, сказав, что результат одинаков:

uint16_t n = (arr[4] << 8) | arr[3];
uint16_t n2 = ((uint16_t*)(arr + 1))[1];
Вбил на годболт: (test это первый, test2 - второй соответственно)
Спойлер:

Хз, стоит ли так делать вообще, все-таки "premature optimization is the root of all evil". Да и код непонятнее становится.

 

Сейчас, кстати, сделал такой код:

void test(uint8_t* arr)
{
    arr[0] = (arr[4] << 8) | arr[3];
}
void test2(uint8_t* arr)
{
    arr[0] = ((uint16_t*)(arr + 1))[1];
}
И assembly output получился почти идентичный
Спойлер:

lexani4321

Пользователь

Регистрация: 28.03.2018

Сообщения: 13019

Рейтинг: 4063

lexani4321

Регистрация: 28.03.2018

Сообщения: 13019

Рейтинг: 4063

Kagon сказал(а):

Да и код непонятнее становится

Нажмите, чтобы раскрыть...

Можно подумать до этого он был понятным.

Kagon

Пользователь

Регистрация: 14.03.2017

Сообщения: 12770

Рейтинг: 7256

Kagon

Регистрация: 14.03.2017

Сообщения: 12770

Рейтинг: 7256

lexani4321 сказал(а):

Можно подумать до этого он был понятным.

Нажмите, чтобы раскрыть...

Таки было

salah

Пользователь

Регистрация: 20.04.2019

Сообщения: 1055

Рейтинг: -90

Нарушения: 170

salah

Регистрация: 20.04.2019

Сообщения: 1055

Рейтинг: -90

Нарушения: 170

какой национальности этот язык, простите?)

OlegPobeditel

Пользователь

Регистрация: 20.02.2019

Сообщения: 575

Рейтинг: 72

OlegPobeditel

Регистрация: 20.02.2019

Сообщения: 575

Рейтинг: 72

Kagon сказал(а):

Препод по информатике рассказывал про методы оптимизации, и упомянул странный но любопытный как по мне метод, касающийся кастов типа массива. Привел такой код в пример, сказав, что результат одинаков:

uint16_t n = (arr[4] << 8) | arr[3];
uint16_t n2 = ((uint16_t*)(arr + 1))[1];
Вбил на годболт: (test это первый, test2 - второй соответственно)
Спойлер:

Хз, стоит ли так делать вообще, все-таки "premature optimization is the root of all evil". Да и код непонятнее становится.

 

Сейчас, кстати, сделал такой код:

void test(uint8_t* arr)
{
    arr[0] = (arr[4] << 8) | arr[3];
}
void test2(uint8_t* arr)
{
    arr[0] = ((uint16_t*)(arr + 1))[1];
}
И assembly output получился идентичный
Спойлер:

Нажмите, чтобы раскрыть...

в чем вопрос? Ты просто похвастаться решил или что? Если нужно оптимизировать - оптимизируешь, не нужно - не оптимизируешь. Шо за тупость? WaitWhat.png

Kagon

Пользователь

Регистрация: 14.03.2017

Сообщения: 12770

Рейтинг: 7256

Kagon

Регистрация: 14.03.2017

Сообщения: 12770

Рейтинг: 7256

OlegPobeditel сказал(а):

в чем вопрос? Ты просто похвастаться решил или что? Если нужно оптимизировать - оптимизируешь, не нужно - не оптимизируешь. Шо за тупость? WaitWhat.png

Нажмите, чтобы раскрыть...

Спросил. Вопрос же касательно premature optimization и того, стоит ли жертвовать читаемостью CoolNut.png

salah сказал(а):

какой национальности этот язык, простите?)

Нажмите, чтобы раскрыть...

C

OlegPobeditel сказал(а):

Ты просто похвастаться решил или что?

Нажмите, чтобы раскрыть...

А чем, кстати?

OlegPobeditel

Пользователь

Регистрация: 20.02.2019

Сообщения: 575

Рейтинг: 72

OlegPobeditel

Регистрация: 20.02.2019

Сообщения: 575

Рейтинг: 72

Kagon сказал(а):

Спросил. Вопрос же касательно premature optimization и того, стоит ли жертвовать читаемостью CoolNut.png

C

Нажмите, чтобы раскрыть...

я кажется ответил на вопрос. Зачем тебе заниматься оптимизацией, если всё ок и этого не требуется никто и ничто? 

Если тебе сказали, чтобы прога работала максимально быстро - оптимизируешь. Что-то работает недостаточно - оптимизируешь и т.д. 

Глупый вопрос максимально. 

У каждого действия должен быть смысл. Есть ли смысл тебе оптимизировать сразу? Зависит от твоих задач. 

salah

Пользователь

Регистрация: 20.04.2019

Сообщения: 1055

Рейтинг: -90

Нарушения: 170

salah

Регистрация: 20.04.2019

Сообщения: 1055

Рейтинг: -90

Нарушения: 170

Kagon сказал(а):

Спросил. Вопрос же касательно premature optimization и того, стоит ли жертвовать читаемостью CoolNut.png

C

А чем, кстати?

Нажмите, чтобы раскрыть...

ужос

Kagon

Пользователь

Регистрация: 14.03.2017

Сообщения: 12770

Рейтинг: 7256

Kagon

Регистрация: 14.03.2017

Сообщения: 12770

Рейтинг: 7256

salah сказал(а):

ужос

Нажмите, чтобы раскрыть...

Шо именно? 

nubideus

Пользователь

Регистрация: 27.02.2015

Сообщения: 6383

Рейтинг: 2480

nubideus

Регистрация: 27.02.2015

Сообщения: 6383

Рейтинг: 2480

Kagon сказал(а):

Сейчас, кстати, сделал такой код:

void test(uint8_t* arr)
{
    arr[0] = (arr[4] << 8) | arr[3];
}
void test2(uint8_t* arr)
{
    arr[0] = ((uint16_t*)(arr + 1))[1];
}
Нажмите, чтобы раскрыть...

у тебя тут ошибка, arr имеет тип uint8_t, а ты делаешь arr[0] = result. компилятор обрезал выражение, так как ты присваиваешь в uint8. присваивать нужно в uint16, как это было в первом листинге.

 

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

 

"premature optimization is the root of all evil" - писать говно - зло в любом случае. прежде чем филосовствовать, мейби все таки сначала научишься писать нормальный код и его оптимизировать?

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

Kagon

Пользователь

Регистрация: 14.03.2017

Сообщения: 12770

Рейтинг: 7256

Kagon

Регистрация: 14.03.2017

Сообщения: 12770

Рейтинг: 7256

nubideus сказал(а):

"premature optimization is the root of all evil" - писать говно - зло в любом случае. прежде чем филосовствовать, мейби все таки сначала научишься писать нормальный код и его оптимизировать?

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

Нажмите, чтобы раскрыть...

Я и  не спорю, я что я днище

nubideus

Пользователь

Регистрация: 27.02.2015

Сообщения: 6383

Рейтинг: 2480

nubideus

Регистрация: 27.02.2015

Сообщения: 6383

Рейтинг: 2480

Kagon сказал(а):

Я и  не спорю, я что я днище

Нажмите, чтобы раскрыть...

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

 

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