Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
3 / 3 / 1
Регистрация: 30.08.2012
Сообщений: 63

Как написать оптимизированный код

02.08.2014, 14:45. Показов 1244. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Интересует вопрос, можно ли реализовать модификацию кода после его отработки, например, в цикле, после какой-то проверки мне уже она будет не нужна и я не хочу, чтобы время уходило на ненужные проверки и хочу не прерывать свой цикл, возможно ли так?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.08.2014, 14:45
Ответы с готовыми решениями:

Оптимизированный поиск в БД
Прошу подскажите формы и метода работы с массивом данных, в котором я ищу конкретное значение. Есть ли какие более удобные способы поиска...

Оптимизированный поиск
Задача простая: есть 2 листа, в каждом по два столбца с данными. Необходимо сравнить эти таблицы на полное совпадение смежных ячеек, и все...

Оптимизированный поиск
Доброе утро. У меня такая пробела возникла. У меня в базе есть 40 000 информаций, и мне надо по ним сделать мгновенный поиск. ...

18
290 / 271 / 107
Регистрация: 10.06.2011
Сообщений: 696
02.08.2014, 16:01
Цитата Сообщение от ZeViS Посмотреть сообщение
модификацию кода
какого кода?
Цитата Сообщение от ZeViS Посмотреть сообщение
после его отработки
обработки чем?
0
3 / 3 / 1
Регистрация: 30.08.2012
Сообщений: 63
02.08.2014, 17:05  [ТС]
Darth Coder,
C#
1
2
3
4
5
6
bool flag = false;
For(int i = 0; i<=5;i++)
{
if (i==1)
flag = true;
}
Думаю, нерациональность этого когда понятна, когда i уже было единицей смысла в дальнейших проверках уже нету...

Цитата Сообщение от Darth Coder Посмотреть сообщение
обработки чем?
оТработки
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
02.08.2014, 17:26
Цитата Сообщение от ZeViS Посмотреть сообщение
нерациональность этого когда понятна,
так пишите рационально.
0
3 / 3 / 1
Регистрация: 30.08.2012
Сообщений: 63
02.08.2014, 19:54  [ТС]
pycture, Вы, похоже, не поняли сути вопроса и написали ответ, зацепившись за слова, это печально... Но проблема состоит в том, что цикл foreach и после того, как я нашел какой-то элемент в массиве мне не надо начинать прогонять его сначала, а другой искомый элемент будет дальше, но мне уже не надо делать предыдущих проверок, так как я нашел уже такой элемент.

Добавлено через 9 минут
C#
1
2
3
4
5
6
7
8
9
bool quality1;
bool quality2;
foreach (Element element in _elements)
{
if (element.quality == 1)
quality1 = true;
if (element.quality == 2)
quality2 = true;
}
Как Вы видите после нахождения наличика качества со значением 1 мне дальнейшие проверки не нужны ибо уже есть, а начинать сначала смысла нету, так как я не могу переместиться на текущее место, если начну новый цикл, а прогонять сначала не нужно так как уже не было элемента с качестом равным 2. Если я начну цикл заново то, массив может быть огромен, и смысла от прогона не будет, больше сожрет, чем лишние проверки наличия...

Добавлено через 2 минуты
Как бы после нахождения качества равного 1 хочется, чтобы цикл модернизировался и становился без этой проверки, то есть принимал такой вид
C#
1
2
3
4
5
foreach (Element element in _elements)
{
if (element.quality == 2)
quality2 = true;
}
при этом не начинаясь сначала
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
02.08.2014, 20:02
ZeViS, есть много способов писать код который выполняется эффективно.
элементарное переписывание условий избавит от лишник проверок сложных условий
C#
1
2
3
4
5
6
7
8
9
bool quality1;
bool quality2;
foreach (Element element in _elements)
{
if (!quality1 && (element.quality == 1))
quality1 = true;
if  (!quality2 && (element.quality == 2))
quality2 = true;
}
хотя в вашем случае они простые и эффекта может не быть. можно вообще завести флаговый массив
C#
1
2
3
4
5
bool[] quality = new bool[2];
foreach (Element element in _elements)
{
quality[element.quality] = true;
}
вариантов 1000-и.
но идея переписывать код во время выполнения никогда не должна приходить в голову если речь идет только об оптимизации скорости выполнения.
0
3 / 3 / 1
Регистрация: 30.08.2012
Сообщений: 63
02.08.2014, 20:13  [ТС]
pycture,
C#
1
2
3
4
5
6
7
8
9
bool quality1;
bool quality2;
foreach (Element element in _elements)
{
if (!quality1 && (element.quality == 1))
quality1 = true;
if  (!quality2 && (element.quality == 2))
quality2 = true;
}
Теперь если у меня не будет качества равного 1, то у меня проверок будет в 2 раза больше, хотя избавляет от избытка записей при большом наличии качества равного 1... просто это реально очень удобно, когда у меня попросту будут переписаны адреса следующих действий

Добавлено через 2 минуты
pycture,
C#
1
2
3
4
5
bool[] quality = new bool[2];
foreach (Element element in _elements)
{
quality[element.quality] = true;
}
Это вообще не то, что нужно, качеств может быть куча, это условно, что они 1 и 2 равны, там вообще могут быть 256 ключи, поэтому это не то...
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
02.08.2014, 20:39
Цитата Сообщение от ZeViS Посмотреть сообщение
просто это реально очень удобно, когда у меня попросту будут переписаны адреса следующих действий
кому удобно? процессору. ему по большому счету все-равно. проверки условий занимают ничтожное кол-во времени. как вы собираетесь "на горячую" менять код в момент выполнения да еще и в том жем цикле - загадка. более того у вас эти куски (циклы) одноразовае чтоли? вы второй раз его не запустите же

Добавлено через 2 минуты
Это вообще не то, что нужно, качеств может быть куча, это условно, что они 1 и 2 равны, там вообще могут быть 256 ключи, поэтому это не то...
используйте Dictinary.

в любом случае выбор не велик. флаги, массивы, словари
0
Кодогенератор
 Аватар для hepper
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
02.08.2014, 22:00
напишите так
C#
1
2
3
4
5
6
7
8
9
bool flag = false;
For(int i = 0; i<=5;i++)
{
if (i==1)
{
flag = true;
break;
}
}
0
3 / 3 / 1
Регистрация: 30.08.2012
Сообщений: 63
02.08.2014, 22:16  [ТС]
hepper, Спасибо за предложение, но дальше я больше раскрыл проблему, а Ваше решение не помогает проблеме

Добавлено через 6 минут
pycture, Спасибо за предложения, эта проблема решается через Action<>
0
871 / 721 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
02.08.2014, 22:17
ZeViS,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool quality1;
bool quality2;
foreach (Element element in _elements)
{
    if (element.quality == 1)
        quality1 = true;
    if (element.quality == 2)
        quality2 = true;
 
    if (quality1 && quality2) 
    {
        break;
    }
}
0
Кодогенератор
 Аватар для hepper
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
02.08.2014, 22:19
Цитата Сообщение от ZeViS Посмотреть сообщение
но дальше я больше раскрыл проблему, а Ваше решение не помогает проблеме
на остальное уже дали ответ. или оптимизируйте код, либо приводите конкретный кусок который надо оптимизировать
0
3 / 3 / 1
Регистрация: 30.08.2012
Сообщений: 63
02.08.2014, 22:46  [ТС]
Спасибо за предложения, эта проблема решается через Action<>
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
03.08.2014, 06:48
Цитата Сообщение от ZeViS Посмотреть сообщение
Спасибо за предложения, эта проблема решается через Action<>
вы даже не представляете насколько у вас просядет производительность по сравнению с вариантом
C#
1
if (!quality1 && (element.quality == 1))
внутри цикла. а вроде как только ради скорости все это и затевалось
1
3 / 3 / 1
Регистрация: 30.08.2012
Сообщений: 63
03.08.2014, 10:50  [ТС]
pycture, Действительно, если мы действия в цикле просто вынесем в функцию, то код уже заметно замедляется
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 class Program
    {
        static bool q = false, qq = false;
        static int i;
        static void Main(string[] args)
        {
            Stopwatch stopWatch = new Stopwatch();            
            stopWatch.Start();
 
            for (i = 1; i < 500000000; i++)
            {
                //if ((!q) && (i % 400000000 == 0)) q = true;
                //if ((!qq) && (i % 100000000 == 0)) qq = true;
                func();
                if (qq && q) break;
            }
 
            stopWatch.Stop();
            // Get the elapsed time as a TimeSpan value.
            TimeSpan ts = stopWatch.Elapsed;
 
            // Format and display the TimeSpan value.
            string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                ts.Hours, ts.Minutes, ts.Seconds,
                ts.Milliseconds / 10);
            Console.WriteLine("RunTime " + elapsedTime);
            Console.ReadKey();
        }
 
        static void func()
        {
            if ((!q) && (i % 400000000 == 0)) q = true;
            if ((!qq) && (i % 100000000 == 0)) qq = true;
        }
 
    }
В этом случае в релизе код уже в 2 раза дольше работает чем
C#
1
2
3
4
5
6
7
 for (i = 1; i < 500000000; i++)
            {
                if ((!q) && (i % 400000000 == 0)) q = true;
                if ((!qq) && (i % 100000000 == 0)) qq = true;
                //func();
                if (qq && q) break;
            }
И это всего лишь вынесли действия... Так это получается вообще по максимуму надо отказываться от функций?)
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
03.08.2014, 11:27
Цитата Сообщение от ZeViS Посмотреть сообщение
Так это получается вообще по максимуму надо отказываться от функций?)
естественно. а Action<> это даже не просто функция а целый объект с кучей логики и проверок внутри.
этот вариатн (который я сразу и дал)
C#
1
2
3
4
5
6
7
 for (i = 1; i < 500000000; i++)
            {
                if ((!q) && (i % 400000000 == 0)) q = true;
                if ((!qq) && (i % 100000000 == 0)) qq = true;
                //func();
                if (qq && q) break;
            }
бедут самым оптимальным по скорости. единственное что можно еще ускорить это избавиться от проверки
C#
1
if (qq && q) break;
на каждой интерации.
и возможно (тут смотреть надо) логику флагов переписать вместо !q использовать q.
это все.

Добавлено через 6 минут
C#
1
if ((!q) && (i % 400000000 == 0)) q = true;
можно менять на
C#
1
q = q | (i % 400000000 == 0)
но тоже надо проверить насколько выгодно (вроде должно быть)
0
3 / 3 / 1
Регистрация: 30.08.2012
Сообщений: 63
03.08.2014, 11:34  [ТС]
pycture, В данном случае не выгоднее поменять местами q и qq
C#
1
if (q && qq) break;
но убирать - замедляет

Главное, что я понял из этой темы, так это то, что надо максимально отказываться от функций в нагруженных местах, как бы оно красиво не выглядело)
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
03.08.2014, 11:39
Цитата Сообщение от ZeViS Посмотреть сообщение
но убирать - замедляет
вы просто неправильно убираете.
эта проверка должна выполняться при изменении q или qq, а не в каждой интерации
1
Кодогенератор
 Аватар для hepper
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
03.08.2014, 17:03
Цитата Сообщение от ZeViS Посмотреть сообщение
что надо максимально отказываться от функций в нагруженных местах
не совсем - точнее так не всегда получится. надо более оптимальнее ставить проверки - например, если есть несколько условий, то начинать надо с того, шанс выполнения которого минимален... и т.д.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.08.2014, 17:03
Помогаю со студенческими работами здесь

Оптимизированный запрос
Здравствуйте. Есть таблица Users ---------------------------------------------------------------- | user_id | долгота | ...

Сайт оптимизированный NetPromoter
Вот, собственно, сам сайт _http://www.geliosco.ru - можно анализировать и делать также!!!

Оптимизированный бинарный поиск
Есть типичный код бинарного поиска, вопрос в том в чем его смысл, много перечитано, не понимаю, что обозначает key и как возможно его...

Качественно оптимизированный сайт
есть конкурент - ukraine.com.ua На странице куча тегов в H1 Вот сдесь - http://rubrikator.e-gloryon.com/0693550088 например есть ссылка...

Какой Windows самый быстрый и оптимизированный?
Windows 7, Windows 8 или Windows 10? Делимся мнениями и фактами, господа.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Программный отбор элементов справочника Номенклатура по группе 1С
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор под наименованию группы (на. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор элементов справочника Сотрудники по перечислениям 1С
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru