Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование в среде .NET (ASP.NET,ADO.NET) на C#/VB.NET

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162

Открыть новую тему     Написать ответ в эту тему

ppkp

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BlackVetal
Да по часам проверял - в Delphi 35 сек, в C# 105 сек. Процедуры тоже состоят из аналогичных циклов. Я вообще спросил - может у кого уже встречалось такое. ИМХО это из-за Framework'а.

Всего записей: 480 | Зарегистр. 13-04-2006 | Отправлено: 11:55 23-11-2009
ya_Mickey

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ppkp
По-моему у Рихтера было на тему, что оператор foreach ЕМНИП втрое медленнее for. А вообще время надо засекать очень с оглядкой на тело цикла. Можно и for сделать медленнее foreach-а.

Всего записей: 59 | Зарегистр. 14-05-2008 | Отправлено: 13:32 23-11-2009
ppkp

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Про foreach знаем и нигде его не применял.
Тело цикла - ну просто один в один перевел с одного языка на другой

Всего записей: 480 | Зарегистр. 13-04-2006 | Отправлено: 13:53 23-11-2009
ya_Mickey

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ppkp
Низя просто из одного в другой. В .NET другая идеология работы с объектами - все в куче, ничего на стеке (ну почти ничего). Соответственно, надо учитывать - стараться делать "длинные" объекты, пользоваться пулами. При этом надо учитывать, что массивы - тоже объекты и тоже в куче.
Ну плюс такие вещи как boxing тоже учитывать надо.
Не спрашиваю о том, в какой конфигурации все собиралось, надеюсь в Release.

Всего записей: 59 | Зарегистр. 14-05-2008 | Отправлено: 14:03 23-11-2009
ppkp

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
boxing нигде не применялся.
 
Что касается циклов в процедурах - они заполняют FPointsPtr
 
private int[] FPointsPtr;
...
FPointsPtr = new int[FTopoData.Count];
...
for (int i = 0; i < FTopoData.Count; i++) {
  FPointsPtr[i] = i;
  ............
}
Собиралось в Debug и в Release. Запускал Release и вне среды разработки.

Всего записей: 480 | Зарегистр. 13-04-2006 | Отправлено: 14:50 23-11-2009 | Исправлено: ppkp, 14:52 23-11-2009
ya_Mickey

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ppkp
Тогда остается сказать "У дельфи лучше оптимизатор".

Всего записей: 59 | Зарегистр. 14-05-2008 | Отправлено: 15:22 23-11-2009
ppkp

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ну, тогда, наверное, так и есть.
 
Вопрос
Аналог string s.Split(..) в Delphi  
 
Понимаю, что это парсер, но именно такой, а не навороченный я ищу.
Подскажите, где взять исходники сего чуда.
 
Еще есть Graphics.MeasureString(). В Delphi мне самому пришлось писать эту функцию, а тут - подарок.
Где, вообще лежат исходники C# функций ?

Всего записей: 480 | Зарегистр. 13-04-2006 | Отправлено: 15:30 23-11-2009 | Исправлено: ppkp, 15:35 23-11-2009
numetalist



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ppkp
Правой кнопки мыши по нужному тебе методу(классу, свойству и т.д.)-> Перейти к определению(Go to definition). "Родные" дотнетовские файлы будут иметь пометку "из метаданных".

Всего записей: 26 | Зарегистр. 05-02-2008 | Отправлено: 16:27 23-11-2009 | Исправлено: numetalist, 16:30 23-11-2009
ppkp

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
numetalist
Спасибо,
Так только определения функций можно получить. А исходный код - нет.

Всего записей: 480 | Зарегистр. 13-04-2006 | Отправлено: 16:54 23-11-2009 | Исправлено: ppkp, 14:54 25-11-2009
BlackVetal



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ppkp
Судя по коду (что в посте) - обработка идет несколько разных множеств данных? посмотри строчки с эвантами ... Почему ты так уверен, что функции поиска точек работают одинаково? И я соглашусь с ya_Mickey просто так переносить код - не стоит. Для начала попробуй замерить производительность средствами среды разработки (VS 2008 team suit - в меню Analyze - Perfomance wizard; в Delphi не знаю где, точнее уже не помню ...)

Всего записей: 1094 | Зарегистр. 13-11-2005 | Отправлено: 06:39 24-11-2009
ya_Mickey

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ppkp
Чего-то я еще разок проверил твой код после замечания BlackVetal. Кое-что навевает на размышления.
Во-первых, как было отмечено, не факт, что просадка происходит на математике, возможно что функции поиска непонятно как реализованы.
Во-вторых, вот ты говорил, что боксингом не пользуешься, а в то же время есть конструкции
типа aaa[idx].X, которые как раз и производят unboxing для вещественных значений.
В общем, для детального анализа недостаточно информации - нет объявления классов (или структур), нет функций поиска.
В-третьих, оператор switch внутри цикла лучше заменить на вызов делегата - не надо будет КАЖДЫЙ РАЗ в теле цикла проверять условие, которое выглядит установленным вне цикла. Правда при этом прямой вызов будет заменен на косвенный, но я думаю, что-то в этом можно выиграть.
 
По поводу производительности.
Я склонен считать, что оптимизатор дельфи может выиграть только в том, что он может лучше оптимизировать конструкции языка высокого уровня по сравнению с оптимизатором MSIL, который, фактически, оптимизирует только ассемблерные операторы и их последовательности.
 
Однако, MSIL генерирует код _родной_ для заданного процессора, это раз, в то время как дельфи генерирует код для "обобщенного" процессора. Второе, C# позволяет легко распараллеливать код по ядрам процессора средствами .NET, чего не позволяет делать Delphi (насколько я знаю), а приведенный код выглядит распараллеливаемым. Тут можно еще кое-чего порыть.
 
В общем, разные это средства. И требуют они разных подходов.
 

Всего записей: 59 | Зарегистр. 14-05-2008 | Отправлено: 07:00 24-11-2009
ppkp

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо за комментарии, просмотрю все еще раз. Постить здесь весь модуль было бы неразумно по причине его размера. По поводу aaa[idx].X я думаю что здесь нет unboxing т.к. и слева и справа все double. Просмотрю еще раз. Спасибо вам.
 
ЗЫ
строчки с эвантами можно не считать - я их закомментировал - те же яйца.
Вот здесь может быть
 
DiffX = GrowX - FTopoData[FPointsPtr[pnt]].X;
DiffY = GrowY - FTopoData[FPointsPtr[pnt]].Y;
 
заменить на
 
int aa =FPointsPtr[pnt];
DiffX = GrowX - FTopoData[aa].X;
DiffY = GrowY - FTopoData[aa].Y;
 
Сейчас стоит Delphi а C# нет, поэтому проверить не могу

Всего записей: 480 | Зарегистр. 13-04-2006 | Отправлено: 15:53 24-11-2009 | Исправлено: ppkp, 17:56 24-11-2009
ya_Mickey

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ppkp

Цитата:
По поводу aaa[idx].X я думаю что здесь нет unboxing т.к. и слева и справа все double.  

Здесь боксинг есть, но не тот о котором ты думаешь.
Если aaa - класс, то боксинг происходит, когда ты засовываешь float в элемент класса.
В данном случае производится анбоксинг - вытаскивание элемента из класса.
 
ЕМНИП, если aaa будет структурой - все будет нормально, лишних операций boxing-unboxing не будет происходить.

Всего записей: 59 | Зарегистр. 14-05-2008 | Отправлено: 06:58 25-11-2009
ppkp

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
aaa определяется так
private List<Point3D> FTopoData = new List<Point3D>();
.............
DiffX = GrowX - FTopoData[FPointsPtr[pnt]].X;
DiffY = GrowY - FTopoData[FPointsPtr[pnt]].Y;
..............
Есть здесь боксинг?
 
Да не в боксинге дело,ИМХО. Как же мне тогда определять FTopoData ? Через ArrayList ?

Всего записей: 480 | Зарегистр. 13-04-2006 | Отправлено: 14:11 25-11-2009 | Исправлено: ppkp, 14:56 25-11-2009
numetalist



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Такая вот проблема.
Хотел сделать full screen режим на DirecX@C#, создавал устройство таким вот образом:

Код:
 
PresentParameters presentParams = new PresentParameters();
                presentParams.BackBufferWidth = 800;
                presentParams.BackBufferHeight = 600;
                presentParams.BackBufferFormat = Format.R5G6B5;
                 
                presentParams.Windowed = false;
                presentParams.SwapEffect = SwapEffect.Discard;
 
                presentParams.AutoDepthStencilFormat = DepthFormat.D16;
                presentParams.EnableAutoDepthStencil = true;
                device = new Microsoft.DirectX.Direct3D.Device(0, Microsoft.DirectX.Direct3D.DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
 
 

 
Изображение мерцает белым цветом(очевидно, что это не проблема с частотой обновления, выставлял и 100hz).

Всего записей: 26 | Зарегистр. 05-02-2008 | Отправлено: 17:50 25-11-2009
ya_Mickey

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ppkp
А поскольку List<> - класс (ну дженерик), боксинг происходит автоматически.
Если мне не изменяет склероз такое можно обойти только массивами. Но это надо уточнить. [Полез уточнять...]
 
Добавлено:
ppkp
А поскольку List<> - класс (ну дженерик), боксинг происходит автоматически.
Если мне не изменяет склероз такое можно обойти только массивами. Но это надо уточнить. [Полез уточнять...]
[Уточнил] Вот тут на эту тему классная статья: http://www.c-sharpcorner.com/UploadFile/stuart_fujitani/BoxNUnbox11192005055746AM/BoxNUnbox.aspx
Там много разговоров о том где и как работает boxing. Основная мысль - как только приводишь к object - получаешь boxing.
 
Теперь к нашим барашкам. Как я и ожидал, для value-типов лучше использовать обычные статические массивы. Хотя они и располагаются в managed-куче, они размещают value-элементы последовательно, соответственно, боксинг не происходит. Соответственно, перед использованием List<Point3D> FTopoData, его лучше перегнать в Array, соответствующим методом.  
И внимательно посмотреть, какой тип имеют FPointsPtr[pnt] из выражения FTopoData[FPointsPtr[pnt]].X. А то тут боксинг тоже очень легко получить.
 
Кстати, в статье замена ArrayList<int> на int[] привела к пятикратному росту производительности. "Задумайтесь над этим" (С).
 
 
Добавлено:
Черт, наврал.
http://en.csharp-online.net/Understanding_Generics%E2%80%94Boxing_Issues_and_Strongly_Typed_Collections
 
В дженериках проблема боксинга вроде не существует...

Всего записей: 59 | Зарегистр. 14-05-2008 | Отправлено: 07:30 26-11-2009
ppkp

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Думаю, что объявление private List<Point3D> FTopoData = new List<Point3D>();  
с последующими обращениями к элементам FTopoData не приводит к боксингу. (Это видно и из статьи, рекомендуемой Вами - спасибо). НО пробовал и вариант с double FTopoData[]. Тут у меня что-то не получалось с добавлением элементов в динамический массив (точнее, с изменением размерности при добавлении элемента)
 

Цитата:
И внимательно посмотреть, какой тип имеют FPointsPtr[pnt]  

Тут все просто
private int[] FPointsPtr;
private int FSearchPoints;
...........
FSearchPoints = 10;
............
int intSize;
......
intSize = FSearchPoints * 8;
FPointsPtr = new int[intSize];

Всего записей: 480 | Зарегистр. 13-04-2006 | Отправлено: 15:09 26-11-2009
ya_Mickey

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ppkp

Цитата:
Тут у меня что-то не получалось с добавлением элементов в динамический массив (точнее, с изменением размерности при добавлении элемента)

массив, объявляемый как int [] fff; не является динамическим.  
Если надо сначала набить массив чем-то, а потом работать - можно использовать или List<> или ArrayList, у которого потом вызывать метод ToArray - получишь на выходе статический массив.
 
Но как я уже и говорил, вроде бы дженерики проблему боксинга в динамических массивах решили. Хотя это надо проверять.
 
Вообще, из статей видно, что в этих случаях интересно просмотреть дизассемблированный MSIL-код на предмет наличия операторов box и unbox.

Всего записей: 59 | Зарегистр. 14-05-2008 | Отправлено: 09:10 27-11-2009
ppkp

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть 3-х мерный неравномерный(рваный) массив. Размерность его сначала неизвестна и получается в результате вычислений. Если кто-нибудь работал с таким массивом, приведите, пожалуйста, пример. В C++ для изменения размерности используется Resize, в Delphi - SetLength, а в C# пока не понял.
 
У меня - так

Код:
 
  public Point2D [][][] Coords;
  int CurveNo = 0;
  int ALevel = 0;
  int PSize = 0;
......
  CurveNo++;
  Coords[ALevel] = new Point2D[CurveNo][];
.........
  PSize++;
  Coords[ALevel][CurveNo - 1] = new Point2D[PSize];
  Coords[ALevel][CurveNo - 1][PSize - 1].X = GrowGX;
  Coords[ALevel][CurveNo - 1][PSize - 1].Y = GrowGY;
 

Правильно ли так. Может быть нужно объявить Coords как "список списков списков"
Просмотрел MSDN по этому вопросу, но так и не решил.

Всего записей: 480 | Зарегистр. 13-04-2006 | Отправлено: 16:19 27-11-2009 | Исправлено: ppkp, 16:56 27-11-2009
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ppkp
http://www.google.com/search?hl=en&source=hp&q=array+c%23+redim&aq=f&oq=&aqi=

Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 21:37 27-11-2009
Открыть новую тему     Написать ответ в эту тему

Страницы: 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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование в среде .NET (ASP.NET,ADO.NET) на C#/VB.NET


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru