HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Результаты опроса: как вы пишите?
1-ый вариант 11 28.21%
второй 28 71.79%
Голосовавшие: 39. Вы ещё не участвовали в этом опросе

Ответ
 
Опции темы Поиск в этой теме Опции просмотра

многократный вызов функции. оптимизация
  #1  
Старый 07.05.2009, 04:33
fucker"ok
Познавший АНТИЧАТ
Регистрация: 21.11.2004
Сообщений: 1,137
С нами: 11298566

Репутация: 761


По умолчанию многократный вызов функции. оптимизация

Вопрос чисто ради интереса.

Код:
for (int i = 0; i < someshit.count(); i++) {}
Код:
int arraySize = someshit.count();
for (int i = 0; i < arraySize; i++) {}
В первом случае метод count() вызывается Х количество раз. Во втором - один раз.

Интересует мнение людей, которые знают как это работает на более низком уровне.
Много ли различных вызовов\обращений к памяти экономит второй пример и есть ли вообще смысл оптимизировать код данным образом?
 
Ответить с цитированием

  #2  
Старый 07.05.2009, 06:59
RumShun
Постоянный
Регистрация: 27.10.2008
Сообщений: 380
С нами: 9231117

Репутация: 149
По умолчанию

Цитата:
В первом случае метод count() вызывается Х количество раз. Во втором - один раз.
в вопросе и ответ, если не хочешь count() вызывать тыщу раз то стоит, проголосовал за второй вариант, хотя пишу в Делфи а там разницы нет
 
Ответить с цитированием

  #3  
Старый 07.05.2009, 07:50
KIR@PRO
Постоянный
Регистрация: 26.12.2007
Сообщений: 353
С нами: 9671366

Репутация: 332
По умолчанию

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

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


p.s. если ты уверен что значение count() у тебя всегда будет не больше 1000 то оба споссоба для человека будут одинаковы (человек не сможет заметить разницу выполнения программ в 100-200 тактов (ну может и побольше))
 
Ответить с цитированием

  #4  
Старый 07.05.2009, 10:41
Algol
Регистрация: 29.05.2002
Сообщений: 1,793
С нами: 12604706

Репутация: 0


По умолчанию

Однозначно второй вариант
 
Ответить с цитированием

  #5  
Старый 07.05.2009, 11:10
t4Nk
Познающий
Регистрация: 23.09.2007
Сообщений: 75
С нами: 9806336

Репутация: 86
По умолчанию

второй вариант, только пишу так:
Код:
for (int i = 0, arraySize = someshit.count(); i < arraySize; i++) {}
 
Ответить с цитированием

  #6  
Старый 07.05.2009, 11:30
Qwazar
Leaders of Antichat - Level 4
Регистрация: 02.06.2005
Сообщений: 1,411
С нами: 11020706

Репутация: 4693


По умолчанию

Конечно второй вариант быстрее.

З.Ы.
А если ещё и цикл разложить в последовательные вызовы и таким образом избавиться от условия на каждой итерации, так вообще Но это не твой случай, т.к. ты не знаешь count.

Единственное - умные компиляторы всё это дело оптимизируют.

З.З.Ы.
А по поводу названия опроса "Как вы пишете", я пишу как во 2м варианте, но к примеру Фаулер, в книге по рефакторингу рекомендует писать как в первом варианте, для того чтобы избавится от лишних переменных и сделать код более наглядным. Ну это правда к этапу оптимизации не относится, а делается раньше
__________________
Я отдал бы немало за пару крыльев,
Я отдал бы немало за третий глаз
За руку на которой четырнадцать пальцев
Мне нужен для дыхания другой газ..

Мой блог:http://qwazar.ru/.

Последний раз редактировалось Qwazar; 07.05.2009 в 11:37..
 
Ответить с цитированием

  #7  
Старый 07.05.2009, 19:06
KIR@PRO
Постоянный
Регистрация: 26.12.2007
Сообщений: 353
С нами: 9671366

Репутация: 332
По умолчанию

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

  #8  
Старый 07.05.2009, 19:09
Qwazar
Leaders of Antichat - Level 4
Регистрация: 02.06.2005
Сообщений: 1,411
С нами: 11020706

Репутация: 4693


По умолчанию

KIR@PRO, код пишут для людей а не для компов. (Ну без фанатизма, я к тому что код должен быть понятен) В больших проектах за непонятный код надо по пальцам стучать. Представь как его потом апдейтить и багфиксить. Но по мне временные переменные - наоборот могут внести ясность, за счёт нормального имени переменной.

З.Ы.
А оптимизация это уже последний этап, когда код работает и ты по нему бегаешь профайлером, выясняя что именно стоит оптимизировать.
__________________
Я отдал бы немало за пару крыльев,
Я отдал бы немало за третий глаз
За руку на которой четырнадцать пальцев
Мне нужен для дыхания другой газ..

Мой блог:http://qwazar.ru/.

Последний раз редактировалось Qwazar; 07.05.2009 в 19:12..
 
Ответить с цитированием

  #9  
Старый 07.05.2009, 19:42
KIR@PRO
Постоянный
Регистрация: 26.12.2007
Сообщений: 353
С нами: 9671366

Репутация: 332
По умолчанию

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

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

p.p.s. но это мнение каждого из нас)
 
Ответить с цитированием

посмотрел...
  #10  
Старый 07.05.2009, 20:21
W!z@rD
Reservists Of Antichat - Level 6
Регистрация: 12.02.2006
Сообщений: 891
С нами: 10653446

Репутация: 836


По умолчанию посмотрел...

результат под запуском профайлера:


результат профайлера:


используемый код:
PHP код:
using System;
using System.Collections.Generic;

namespace 
ConsoleApplication1
{
    class 
Program
    
{
        private const 
int MaxLength 100000;

        private static 
readonly List<int> list = new List<int>();

        static 
void GetList()
        {
            
int i 0;
            while (
MaxLength)
            {
                list.
Add(i);
                
i++;
            }
        }

        static 
DateTime Method1()
        {
            for (
int i 0< list.Counti++)
            {
                
int a;
                
100;
                
int b >> << 3;
            }
            return 
DateTime.Now;
        }

        static 
DateTime Method2()
        {
            
int size = list.Count;
            for (
int i 0sizei++)
            {
                
int a;
                
100;
                
int b >> << 3;
            }
            return 
DateTime.Now;
        }

        static 
void Main()
        {
            
GetList();
            var 
DateTime.Now;
            
Console.WriteLine(string.Format("Method 1. Time elapsed: {0}", (Method1() - a)));
            
DateTime.Now;
            
Console.WriteLine(string.Format("Method 2. Time elapsed: {0}", (Method2() - a)));
            
Console.ReadLine();
        }
    }

надеюсь я не тупанул, хотя как оговаривалось ранее, все зависит от реализации используемого объекта.

p.s. было интересно, а будет-ли разница? Оказалось есть.

Проц Core2Duo E8400
__________________
*********************************
*Я не волшебник ٩(๏̯͡๏)۶, только учусь...*
*********************************
Программы на заказ
Times to fly...

Последний раз редактировалось W!z@rD; 07.05.2009 в 20:27..
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с буфером обмена в kernel-mode 0x0c0de Реверсинг 11 01.06.2009 11:51
Поиск PHP уязвимостей на примере phpBB _-[A.M.D]HiM@S-_ Статьи 1 29.10.2006 11:18



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.