Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
|
Результаты опроса: как вы пишите?
|
|
1-ый вариант
|
  
|
11 |
28.21% |
|
второй
|
  
|
28 |
71.79% |
 |
|

07.05.2009, 20:21
|
|
Reservists Of Antichat - Level 6
Регистрация: 12.02.2006
Сообщений: 891
Провел на форуме: 1892597
Репутация:
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 (i < MaxLength)
{
list.Add(i);
i++;
}
}
static DateTime Method1()
{
for (int i = 0; i < list.Count; i++)
{
int a;
a = i ^ 100;
int b = a >> 2 << 3;
}
return DateTime.Now;
}
static DateTime Method2()
{
int size = list.Count;
for (int i = 0; i < size; i++)
{
int a;
a = i ^ 100;
int b = a >> 2 << 3;
}
return DateTime.Now;
}
static void Main()
{
GetList();
var a = DateTime.Now;
Console.WriteLine(string.Format("Method 1. Time elapsed: {0}", (Method1() - a)));
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..
|
|
|

07.05.2009, 22:42
|
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме: 2050916
Репутация:
0
|
|
Сообщение от W!z@rD
надеюсь я не тупанул, хотя как оговаривалось ранее, все зависит от реализации используемого объекта.
p.s. было интересно, а будет-ли разница? Оказалось есть.
В примере топикстартера используется метод someshit.count(); , а не свойство, как у тебя.
В твоем примере разница между вызовом свойства и локальной переменной - минимальна.
А вот если count() - это метод, со сложной внутренней реализацией, то разница будет намного большей.
PS
Да, и использованный тест не очень показателен. Нужно что бы время выполнения было хотя бы несколько секунд. Разница в 3 сотых - вполне может быть случайной. Особенно в дотнете.
|
|
|

07.05.2009, 23:07
|
|
Познавший АНТИЧАТ
Регистрация: 21.11.2004
Сообщений: 1,137
Провел на форуме: 2487541
Репутация:
761
|
|
по-моему такого вообще не должно быть, должна быть переменная Size, которая обновляется сама собой.
В том то и дело, что как правило внутри класса есть такая переменная, но почему-то во многих фреймворках, например в QT делается так, что все свойства закрытые, а доступ к ним получаем через методы.
Довольно часто можно встретить такое:
Код:
class a
{
public:
int count() { return size;}
private:
int size;
};
|
|
|

08.05.2009, 00:19
|
|
Leaders of Antichat - Level 4
Регистрация: 02.06.2005
Сообщений: 1,411
Провел на форуме: 10605912
Репутация:
4693
|
|
Сообщение от fucker"ok
В том то и дело, что как правило внутри класса есть такая переменная, но почему-то во многих фреймворках, например в QT делается так, что все свойства закрытые, а доступ к ним получаем через методы.
На данный момент, доступ к переменным через геттеры/сеттеры - стандарт. (И это действительно оправдано)
З.Ы.
Если не понятно почему, то во первых чтобы со стороны никто не мог внезапно изменить данное поле (в случае public ты можешь записать левое значение в переменную size и класс об этом не узнает, чем черевато - понятно), а так ты можешь сделать поле доступным извне только на чтение, или только на запись, во вторых если требуется изменить внутреннюю структуру класса и удалить/переименовать эту переменную, чтобы не требовалось искать всех пользователей класса, и менять их. (Просто достаточно будет изменить реализацию геттеров/сеттеров, тогда интерфейс класса останется неизменным). Вот по крайней мере 2 плюса использования геттеров сеттеров.
Ну ещё можно при помощи изменения геттеров подгонять объекты под требования пользователя класса, или добавлять в них проверки ввода, но сложная логика в геттерах/сеттерах - не клёво и неправильно.
__________________
Я отдал бы немало за пару крыльев,
Я отдал бы немало за третий глаз
За руку на которой четырнадцать пальцев
Мне нужен для дыхания другой газ..
Мой блог: http://qwazar.ru/.
Последний раз редактировалось Qwazar; 08.05.2009 в 00:52..
|
|
|

08.05.2009, 01:08
|
|
Новичок
Регистрация: 07.05.2009
Сообщений: 1
Провел на форуме: 14325
Репутация:
0
|
|
Проголосовал за 1-й вариант, потом вдумался и пришёл к выводу что пишу всё-же по второму варианту.
В принципе если метод count() имеет какую то сложную реализацию то это существенно скажется на производительность.
|
|
|

08.05.2009, 01:18
|
|
Познавший АНТИЧАТ
Регистрация: 21.11.2004
Сообщений: 1,137
Провел на форуме: 2487541
Репутация:
761
|
|
Если не понятно почему, то во первых чтобы со стороны никто не мог внезапно изменить данное поле (в случае public ты можешь записать левое значение в переменную size и класс об этом не узнает, чем черевато - понятно),
Как-то не подумал об этом. Действительно, это страхует. 
|
|
|

08.05.2009, 07:35
|
|
Reservists Of Antichat - Level 6
Регистрация: 12.02.2006
Сообщений: 891
Провел на форуме: 1892597
Репутация:
836
|
|
Сообщение от Algol
В примере топикстартера используется метод someshit.count(); , а не свойство, как у тебя.
В твоем примере разница между вызовом свойства и локальной переменной - минимальна.
А вот если count() - это метод, со сложной внутренней реализацией, то разница будет намного большей.
PS
Да, и использованный тест не очень показателен. Нужно что бы время выполнения было хотя бы несколько секунд. Разница в 3 сотых - вполне может быть случайной. Особенно в дотнете.
хм так и знал что глупость сделал, но думаю это можно решить если использовать LINQ запрос.
вечером как окажусь дома переделаю...
думаю будет нагляднее.
update:
не выдержал, проверил с LINQ на работе, результат без профайлера:
Method 1. Time elapsed: 00:00:00.0468753
Method 2. Time elapsed: 00:00:00
update2:
с профайлером:
Method 1. Time elapsed: 00:00:00.0781250
Method 2. Time elapsed: 00:00:00.0156250
__________________
*********************************
*Я не волшебник ٩(๏̯͡๏)۶, только учусь...*
*********************************
Программы на заказ
Times to fly...
Последний раз редактировалось W!z@rD; 08.05.2009 в 17:13..
|
|
|

14.05.2009, 00:08
|
|
Постоянный
Регистрация: 16.08.2006
Сообщений: 640
Провел на форуме: 1354067
Репутация:
599
|
|
сколько раз гонялся тест? нужно минимум для каждого варианта прогнать по 10-50 раз. чтобы исключить момент подгрузки кода в кеш.
по поводу опроса - не хватает еще варианта ответа - одно***ственно. ибо потери на вызове метода, пусть даже виртуального, не окажут никакого ощутимого влияния. а лишняя локальная переменная в таком месте, объявленная вне цикла, может позже помешать вынести этот цикл в отдельный метод. так что чисто из соображений дальнейшей поддержки проекта и читабельности я бы предпочел первый вариант.
по поводу форматирования - почитайте Макконнелла.
по поводу переменных - int x = strlen("blabla") - strlen("bla"); на уровне асма будет эквивалентен коду
int blabla_len = strlen("blabla");
int bla_len = strlen("bla");
int blabla_len_dif = blabla_len - bla_len;
суть отказа от локальных переменных как раз в другом. чтобы в больших методах можно было легко читать логику. этот код например в случае нахождения в большом методе выносится в отдельный и заменяется на blabla_len_dif("blabla", "bla"); ибо это понятнее и требует меньше времени на чтения, ибо банально занимает 1 строку. ну и в добавок сей код можно в дальнейшем вызывать из любого места класса, плюс сделать метод публичным и дать другим классам с ним работать.
зы: чтите Фаулера, Макконнелла, GoF.
Последний раз редактировалось Ra$cal; 14.05.2009 в 17:20..
|
|
|

14.05.2009, 01:13
|
|
Pagan Heart
Регистрация: 12.08.2004
Сообщений: 3,791
Провел на форуме: 6490435
Репутация:
2290
|
|
Совет: пишите так, как проще и меньше кода.
Оптимиировать надо не все подряд, а только узкие места.
Все подряд оптимизируют лишь распиздяи 
|
|
|

14.05.2009, 01:15
|
|
Постоянный
Регистрация: 12.04.2007
Сообщений: 413
Провел на форуме: 3578578
Репутация:
275
|
|
W!z@rD
попробуй поменять местами тесты
10к-50к я бы сказал.
Последний раз редактировалось Forcer; 14.05.2009 в 01:17..
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|