Угадай где говнокод!?

Вот два примера реализации функции для обнуления массива:


int a[n];

...

void clear_array_1()

{

int i; 

for (i = 0; i < n; i++)

{

a[i]=0;

}

}

....

void clear_array_2()

{

a[0]=0;

a[1]=0;

a[2]=0;

...

a[n-2]=0;

a[n-1]=0;

}

...


Информация к размышлению:


Функция void clear_array_1

- достоинства, в случае большого массива малое количество строк кода (меньший конечный размер приложения) ; 

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


Функция void clear_array_2

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

- недостатки, в случае большого массива большое количество строк кода (дополнительные затраты времени на написание, но если платят за количество строк, резко превращается в достоинство! ;-) ).


Разъясните мне бестолковому, какая из функций говнокод, а какая для тру отцов???

0
DELETED
Автор поста оценил этот комментарий

я не вижу никакой разницы, в обоих случая перебор - либо через цикл, либо через "ручной" доступ. Что вы тут экономите? Строчки на вашем мониторе? Не забывайте про оптимизации современных компиляторов.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

первый вариант, раза в 3-4 медленнее второго, в случае если эта функция затем используется в других функциях, которые в свою очередь используются в других, то задержки становятся довольно ощутимы.

показать ответы
0
DELETED
Автор поста оценил этот комментарий

Я это написал потому, что вы не сказали где код крутится будет. Кстати, под какую железку пишите?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

последнее время под PIC12f629, частотно-амплитудный регулятор делал.

показать ответы
0
Автор поста оценил этот комментарий

А ещё 4 байта озу ))))

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

а если в 64 потока, рекурсивно?! :))))

0
Автор поста оценил этот комментарий

Второй варинт херня полная. Что если длина массива изменится?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

динамические массивы, это немного другая песня, речь о заранее известном размере.

2
DELETED
Автор поста оценил этот комментарий

Обе говнокод. Потому что сферический в вакууме.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

вот так сначала, сферический в вакууме, а потом 4 гига оперативки не хватает, чтобы тетрис запустить ;-)

показать ответы
3
Автор поста оценил этот комментарий
На мой взгляд ты хуйней занимаешься
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Ну если программирование реалтайм вычислений на контроллерах, это хуйня, то да занимаюсь хуйнёй. :-)

показать ответы
1
Автор поста оценил этот комментарий

В языках "уровня бог" нет переменных в принципе.

Циклов тоже нет, кстати.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Массивы нервно курят в сторонке, вместt с делением и умножением :-))

0
DELETED
Автор поста оценил этот комментарий

Можете показать тестовый стенд? Как вы измеряли? В какой среде работает код и на каких данных?

раскрыть ветку (1)
Автор поста оценил этот комментарий

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

показать ответы
1
DELETED
Автор поста оценил этот комментарий

О! годный камушек, в SO-8 корпусе он особенно приятен. Работал с таким давно, на асме писал. Но пики тупиковая штука (личное мнение, возможно ошибочное).

раскрыть ветку (1)
Автор поста оценил этот комментарий

Это не тупиковая штука, а полностью законченный продукт! Как молоток, не всегда нужно написать ИИ, чтобы вбить гвоздь! ;-))

0
Автор поста оценил этот комментарий

Судя по синтаксису, это что-то с подобное. Там для этого memset придумали.

http://www.cplusplus.com/reference/cstring/memset/

раскрыть ветку (1)
Автор поста оценил этот комментарий

#include < string.h > 

Автор поста оценил этот комментарий

Да уж.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Чё уж?

показать ответы
0
Автор поста оценил этот комментарий

mov edi,ADDRESS

mov ecx,(ADDRESS_END-ADDRESS)

mov al,00H

rep stosd


пример для 32бит.

раскрыть ветку (1)
Автор поста оценил этот комментарий

пример на ASM для Intel386 хорош, но не применим к другим платформам, да и речь в принципе не о том, чтобы именно нулями заполнить, можно и от 1 до 100 по порядку. Короче на все случаи жизни не придумаешь специальной команды, а существование конкретно "rep stosd", показывает что в принципе проблема оптимизации актуальна.

0
Автор поста оценил этот комментарий

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

раскрыть ветку (1)
Автор поста оценил этот комментарий

пример скомпилированных инструкций в студию ;)

показать ответы
0
Автор поста оценил этот комментарий

Чего-то я не подумала :) Все равно такой код модифицируется только руками. Было бы в C что-то типа eval()... то есть можно, конечно, переполнить буфер, но это высший пилотаж. Лучше потерять пару бит, чем отстрелить себе ногу.

раскрыть ветку (1)
Автор поста оценил этот комментарий

на самом деле, тут дело не столько в оперативке, сколько в количестве инструкций процессора, для заполнения одной ячейки массива, во втором варианте на одну ячейку, одна инструкция, а в первой, заполнение инкремент проверка переход, то есть на 75% дольше ;-) и если это низкоуровневая функция, то фризы будут нарастать с каждым повышением уровня абстракции (от железа естественно).

0
Автор поста оценил этот комментарий

упаковываешь код?
создатели Креша Бандикута таким занимались
переписывали код совсем не изменяя логики;
им нужно было упаковать игру. тебе серьезно нужно это?

раскрыть ветку (1)
Автор поста оценил этот комментарий

не, просто функции для прерываний пишу ;)

Автор поста оценил этот комментарий

Во многих языках массивы - итерируемые объекты. "Уровень бог" выглядит так:
def clear_array(){for i in array{ i = 0;}}


А еще наслаждайся

https://en.cppreference.com/w/cpp/algorithm/fill

раскрыть ветку (1)
Автор поста оценил этот комментарий

Вариант по ссылке, похоже на 32bit оси не запустится, памяти не хватит ;-)

показать ответы
0
DELETED
Автор поста оценил этот комментарий

STM32?

раскрыть ветку (1)
Автор поста оценил этот комментарий

зришь в корень ;-)

показать ответы

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества