Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Программирование в среде .NET (ASP.NET,ADO.NET) на C#/VB.NET

Автор: ya_Mickey
Дата сообщения: 23.11.2009 12:32
ppkp
По-моему у Рихтера было на тему, что оператор foreach ЕМНИП втрое медленнее for. А вообще время надо засекать очень с оглядкой на тело цикла. Можно и for сделать медленнее foreach-а.
Автор: ppkp
Дата сообщения: 23.11.2009 12:53
Про foreach знаем и нигде его не применял.
Тело цикла - ну просто один в один перевел с одного языка на другой
Автор: ya_Mickey
Дата сообщения: 23.11.2009 13:03
ppkp
Низя просто из одного в другой. В .NET другая идеология работы с объектами - все в куче, ничего на стеке (ну почти ничего). Соответственно, надо учитывать - стараться делать "длинные" объекты, пользоваться пулами. При этом надо учитывать, что массивы - тоже объекты и тоже в куче.
Ну плюс такие вещи как boxing тоже учитывать надо.
Не спрашиваю о том, в какой конфигурации все собиралось, надеюсь в Release.
Автор: ppkp
Дата сообщения: 23.11.2009 13:50
boxing нигде не применялся.

Что касается циклов в процедурах - они заполняют FPointsPtr

private int[] FPointsPtr;
...
FPointsPtr = new int[FTopoData.Count];
...
for (int i = 0; i < FTopoData.Count; i++) {
FPointsPtr[i] = i;
............
}
Собиралось в Debug и в Release. Запускал Release и вне среды разработки.
Автор: ya_Mickey
Дата сообщения: 23.11.2009 14:22
ppkp
Тогда остается сказать "У дельфи лучше оптимизатор".
Автор: ppkp
Дата сообщения: 23.11.2009 14:30
Ну, тогда, наверное, так и есть.

Вопрос
Аналог string s.Split(..) в Delphi

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

Еще есть Graphics.MeasureString(). В Delphi мне самому пришлось писать эту функцию, а тут - подарок.
Где, вообще лежат исходники C# функций ?
Автор: numetalist
Дата сообщения: 23.11.2009 15:27
ppkp
Правой кнопки мыши по нужному тебе методу(классу, свойству и т.д.)-> Перейти к определению(Go to definition). "Родные" дотнетовские файлы будут иметь пометку "из метаданных".
Автор: ppkp
Дата сообщения: 23.11.2009 15:54
numetalist
Спасибо,
Так только определения функций можно получить. А исходный код - нет.
Автор: BlackVetal
Дата сообщения: 24.11.2009 05:39
ppkp
Судя по коду (что в посте) - обработка идет несколько разных множеств данных? посмотри строчки с эвантами ... Почему ты так уверен, что функции поиска точек работают одинаково? И я соглашусь с ya_Mickey просто так переносить код - не стоит. Для начала попробуй замерить производительность средствами среды разработки (VS 2008 team suit - в меню Analyze - Perfomance wizard; в Delphi не знаю где, точнее уже не помню ...)
Автор: ya_Mickey
Дата сообщения: 24.11.2009 06:00
ppkp
Чего-то я еще разок проверил твой код после замечания BlackVetal. Кое-что навевает на размышления.
Во-первых, как было отмечено, не факт, что просадка происходит на математике, возможно что функции поиска непонятно как реализованы.
Во-вторых, вот ты говорил, что боксингом не пользуешься, а в то же время есть конструкции
типа aaa[idx].X, которые как раз и производят unboxing для вещественных значений.
В общем, для детального анализа недостаточно информации - нет объявления классов (или структур), нет функций поиска.
В-третьих, оператор switch внутри цикла лучше заменить на вызов делегата - не надо будет КАЖДЫЙ РАЗ в теле цикла проверять условие, которое выглядит установленным вне цикла. Правда при этом прямой вызов будет заменен на косвенный, но я думаю, что-то в этом можно выиграть.

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

Однако, MSIL генерирует код _родной_ для заданного процессора, это раз, в то время как дельфи генерирует код для "обобщенного" процессора. Второе, C# позволяет легко распараллеливать код по ядрам процессора средствами .NET, чего не позволяет делать Delphi (насколько я знаю), а приведенный код выглядит распараллеливаемым. Тут можно еще кое-чего порыть.

В общем, разные это средства. И требуют они разных подходов.

Автор: ppkp
Дата сообщения: 24.11.2009 14:53
Спасибо за комментарии, просмотрю все еще раз. Постить здесь весь модуль было бы неразумно по причине его размера. По поводу 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# нет, поэтому проверить не могу
Автор: ya_Mickey
Дата сообщения: 25.11.2009 05:58
ppkp

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

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

ЕМНИП, если aaa будет структурой - все будет нормально, лишних операций boxing-unboxing не будет происходить.
Автор: ppkp
Дата сообщения: 25.11.2009 13:11
aaa определяется так
private List<Point3D> FTopoData = new List<Point3D>();
.............
DiffX = GrowX - FTopoData[FPointsPtr[pnt]].X;
DiffY = GrowY - FTopoData[FPointsPtr[pnt]].Y;
..............
Есть здесь боксинг?

Да не в боксинге дело,ИМХО. Как же мне тогда определять FTopoData ? Через ArrayList ?
Автор: numetalist
Дата сообщения: 25.11.2009 16:50
Такая вот проблема.
Хотел сделать 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);

Автор: ya_Mickey
Дата сообщения: 26.11.2009 06:30
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

В дженериках проблема боксинга вроде не существует...
Автор: ppkp
Дата сообщения: 26.11.2009 14:09
Думаю, что объявление 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];
Автор: ya_Mickey
Дата сообщения: 27.11.2009 08:10
ppkp

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

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

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

Вообще, из статей видно, что в этих случаях интересно просмотреть дизассемблированный MSIL-код на предмет наличия операторов box и unbox.
Автор: ppkp
Дата сообщения: 27.11.2009 15:19
Есть 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;
Автор: dneprcomp
Дата сообщения: 27.11.2009 20:37
ppkp
http://www.google.com/search?hl=en&source=hp&q=array+c%23+redim&aq=f&oq=&aqi=
Автор: ppkp
Дата сообщения: 29.11.2009 14:09
dneprcomp
Спасибо, почитал, но вот вариант применения Array.Copy для добавления элемента в jagged Array (в 3-х мерную коллекцию) тяжеловат. Буду пробовать список списков.
Автор: numetalist
Дата сообщения: 29.11.2009 17:17
Как вывести на экран текст при помощи DirectX в C#?
Автор: Lihonosov
Дата сообщения: 29.11.2009 20:19
numetalist
Displaying text using DirectX
Автор: ppkp
Дата сообщения: 30.11.2009 19:59
numetalist

Цитата:
Хотел сделать full screen режим на DirecX@C#, создавал устройство таким вот образом:
Изображение мерцает белым цветом(очевидно, что это не проблема с частотой обновления, выставлял и 100hz).


Повторил полностью Ваш код - мерцания нет. DirectX март 2009

Добавлено:
numetalist

Цитата:
Как вывести на экран текст при помощи DirectX в C#?


В обрработчике Paint написал


Код:
private void Form1_Paint(object sender, PaintEventArgs e) {
PresentParameters presentParams = new PresentParameters();
presentParams.Windowed = true;
presentParams.SwapEffect = SwapEffect.Discard;
presentParams.PresentationInterval = PresentInterval.One;

Microsoft.DirectX.Direct3D.DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
Microsoft.DirectX.Direct3D.Device device = new Microsoft.DirectX.Direct3D.Device(0, Microsoft.DirectX.Direct3D.DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
device.Clear(ClearFlags.Target, System.Drawing.Color.Black, 1.0f, 0);
device.BeginScene();

System.Drawing.Font systemfont = new System.Drawing.Font("Arial", 12f,FontStyle.Regular);
_font = new Microsoft.DirectX.Direct3D.Font(device, systemfont);
_font.DrawText(null, "string1", new Rectangle(0, 100, 100, 100), DrawTextFormat.Left, Color.White);
_font.DrawText(null, "строка 2", new Point(10, 20), Color.Red);

device.EndScene();
device.Present();//!!!!!!!!!!!!!!!!!!
}
Автор: ppkp
Дата сообщения: 02.12.2009 12:26
Всем, кому интересно
Здесь можно скачать очень полезную утилиту Reflector для просмотра исходного кода .NET сборок

Автор: blaro
Дата сообщения: 02.12.2009 22:01
У меня есть пара вопросов. Я написал функцию для записи в файл. При нажатии на кнопку "Сохранить" все проходит гладко, функция добавляет новые строки в файл, а мне надо чтобы функция удаляла старую запись и записывала новую.
Второй вопрос: Та же прога при загрузке должна читать конфиги из файла. Файл ini. Все конфиги записываются по форме key=value. Соответственно, функция для начала читает строку из файла, потом разделяет её на ключ и значение. Вопрос в следующем, как присвоить значение элементу? Я этого не могу понять до конца.
Автор: EZH
Дата сообщения: 02.12.2009 23:09
blaro
Сугубо IMHO, использовать ini-файлы при работе с .NET как-то не актуально. Может стоит посмотреть в сторону хранения кофигов в XML? Значительно гибче все можно будет организовать, да и для работы с файлами XML и их нодами в .NET есть отличная обвязка классов.
Автор: derelict
Дата сообщения: 02.12.2009 23:21
blaro
В своих проектах я использовал эту библиотеку. Поддерживает работу с настройками, хранящихся в ini-файлах и не только: Nini
Автор: BlackVetal
Дата сообщения: 03.12.2009 05:25
blaro

Цитата:
Вопрос в следующем, как присвоить значение элементу? Я этого не могу понять до конца.

Я так понимаю тебе нужно читать сериализацию (Serialization). В MSDN это описано хорошо ...
Автор: blaro
Дата сообщения: 03.12.2009 08:32
derelict
BlackVetal
Спасибо. Ушел читать.

EZH
Дело в том, что мой препод, который "помогает" мне писать курсовую, хочет чтобы я использовал именно ini. У меня сейчас такое ощущение, что он за всю свою жизнь не написал и строчки кода.
Автор: dneprcomp
Дата сообщения: 03.12.2009 08:37
blaro
Можно попробывать сделать "тупо и просто". Порядок записи key всегда один и тот же?
Все key являются резервными словами и в value попадаться не должны? Или же одна строка - один key?
Даже если все ответы 'нет', все равно можно извернуться.
Прочитать весь файл в переменную. Затем instring(или перебором) находим положение нужного key.
Им же(или перебором) находим начало следующего key или длину/конец строки. Теперь, используя replace, заменяем значение между двумя key. Или всю строку. Перезаписываем весь файл.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102

Предыдущая тема: Как удалить/добавить/отключить/включить устройство?


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.