Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.07.28;
Скачать: [xml.tar.bz2];

Вниз

Как быстро скопировать массив в другой?   Найти похожие ветки 

 
Хыхы   (2013-03-06 15:13) [0]

?


 
Kerk ©   (2013-03-06 15:13) [1]

Move


 
DVM ©   (2013-03-06 15:13) [2]

Move


 
DevilDevil ©   (2013-03-06 15:21) [3]

статический
X := Y

динамический, копия ссылки
X := Y

динамический, уникальный
X := Copy(Y, 0, Length(Y)-1)


 
DevilDevil ©   (2013-03-06 15:28) [4]

Ещё у меня есть такой код. На новых версиях не тестировал.

procedure CopyArray(const dest, source: pointer; const typeinfo: ptypeinfo; const count: integer);
asm
 // если указан статический массив, то домножить count на общее количество элементов в массиве
 // а в typeinfo - базовый элемент
 // сделано это для того чтобы не вызывался Exception
 // по каким то причинам System.CopyArray не приспособлен под аргумент tkArray
 // наверное потому что System.CopyArray внутренняя функция и на этапе прекомпиляции всё грамотно просчитывается
 cmp byte ptr [ecx], tkArray
 jne @1
 push eax
 push edx
   movzx edx, [ecx + TTypeInfo.Name]
   mov eax, [ecx + edx + 6]
   mov ecx, [ecx + edx + 10]
   mul count
   mov ecx, [ecx]
   mov count, eax    
 pop edx
 pop eax
 @1:

 push dword ptr [ebp+8]
 call System.@CopyArray
end;


фишка в том, чтобы скопировать несколько элементов (структур) из одного массива в другой, учитывая typeinfo рутину
в качестве typeinfo надо указывать typeinfo() элемента
если typeinfo() не берётся - то конечно Move + Count*sizeof(Item)


 
Kerk ©   (2013-03-06 15:39) [5]


> DevilDevil ©   (06.03.13 15:28) [4]

Я вот не пойму. Нафига ты так упорно пишешь код, который не скомпилится даже в x64, не говоря уже о всяких модных платформах, которые в Delphi есть и скоро будут? :) И вообще тебе коллеги за использование асма без крайней необходимости руки линейкой еще не отбили? Нравится им это сопровождать? :)


 
DevilDevil ©   (2013-03-06 16:00) [6]

> Kerk ©   (06.03.13 15:39) [5]
> Я вот не пойму.


Я таких людей как ты называю "чёрно-белые" :)
Т.е. те, кто не привык в каждом решении видеть и плюсы, и минусы - кто делит мир на "чёрное" и "белое"

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

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

И получается, что хорошо и что плохо для кода - принципиально зависит от того, какой он. Хороший управляющий код - читабельный, логичный, багобезопасный, хорошо комментируемый, с перспективой роста. И плевать, сколько тактов выполняется управляющий код. Хороший ресурсоёмкий код - тот, который выполняется с максимальной производительностью. И плевать как он написан. С кучей дифайнов, на ассемблере или С++, хорошо он закомментирован или плохо. Главное - чтобы он работал быстро

Топикстартера интересует ресурсоёмкий код, а не управляющий. И требования к нему соответствующие


 
Kerk ©   (2013-03-06 16:10) [7]


> DevilDevil ©   (06.03.13 16:00) [6]

Что, реально, если написать эту процедуру нормальным Delphi-кодом, она станет ощутимо более медленной? Сколько тактов процессора ты выигрываешь? Выигрываешь ли вообще? Сколько миллионов (миллиардов?) раз нужно вызвать твою процедуру, чтобы я заметил разницу на глаз?

Я вот так скажу.

Programmers waste enormous amounts of time thinking about, or worrying about, the speed of noncritical parts of their programs, and these attempts at efficiency actually have a strong negative impact when debugging and maintenance are considered. We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%.

Но это ничего. Я тоже раньше такой был :)


 
картман ©   (2013-03-06 16:15) [8]


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

И получается, что хорошо и что плохо для кода - принципиально зависит от того, какой он. Хороший управляющий код - читабельный, логичный, багобезопасный, хорошо комментируемый, с перспективой роста. И плевать, сколько тактов выполняется управляющий код. Хороший ресурсоёмкий код - тот, который выполняется с максимальной производительностью. И плевать как он написан. С кучей дифайнов, на ассемблере или С++, хорошо он закомментирован или плохо. Главное - чтобы он работал быстро


черно-белые, говоришь?))


 
Kerk ©   (2013-03-06 16:23) [9]


> картман ©   (06.03.13 16:15) [8]

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


 
DevilDevil ©   (2013-03-06 16:29) [10]

> Kerk ©   (06.03.13 16:10) [7]

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

по поводу "на глаз"... Всё меняется с ростом объёмов, которые обрабатывает ресурсоёмкий код. Для пользователя нет разницы, 1мск или 10мск. Но огромная разница между 1мин и 10мин. Кроме того на практике существуют подходы, реагирующие на объёмы не в геометрической прогрессии, а по экспоненте. То же перевыделение памяти. Недавно кстати выкладывал тест на запись текстового файла, и просто безбожно сливал TMemoryStream, который на паре килобайт показывает прекрасный результат

Поэтому моя философия такая. Если я знаю, что код будет дёргаться постоянно и обслуживать большой объём данных - его надо оптимизировать. И ассемблером не брезговать. Если это управляющий код - надо добиться его читабельности, логичности, комментариев побольше, чтобы потом легко было в случае чего вносить дополнения.

Типичный подход в оптимизации - посмотреть в профайлере, что губит производительность - и оптимизировать. Проблема только в том, что на момент оптимизации будет уже дохрена увязанного кода. Редактировать который и тестировать - не особо хочется. Кроме того несмотря на мощности профайлера, программист вполне может проворонить несколько важных слабых мест. Поэтому моя позиция - на момент разработки определять ресурсоёмкие и управляющие места кода. И заниматься каждым из них соответствующе. Ибо потом уже будет поздно, "ошибки на этапе проектирования стоят дорого"

Ну и конечно я считаю жуткими непрофессионалами своего дела тех, кто не способен управляющий код писать логичным, структурированным и читабельным, а ресурсоёмкий код быстрым


 
DevilDevil ©   (2013-03-06 16:31) [11]

> картман ©   (06.03.13 16:15) [8]

чёрно-белые - это люди, которые не способны взвешивать плюсы и минусы. от этого и страдают


 
Kerk ©   (2013-03-06 16:37) [12]

Ну то есть ты не знаешь сколько ты выигрываешь написав ту процедуру на ассемблере. Оптимизация чисто "на глаз". Очень крутой подход, совсем не черно-белый :)


 
Игорь Шевченко ©   (2013-03-06 16:51) [13]

http://www.gunsmoker.ru/2013/01/optimization-basics.html


 
DevilDevil ©   (2013-03-06 16:54) [14]

> Kerk ©   (06.03.13 16:37) [12]

давай начнём с того что приведённый твой "код" в [1] очень даже может привести к Access Vialotion где-нибудь в неожиданном месте программы. И ты не знаешь, почему

и ты не знаешь, что лучше: сортированный массив, дерево (ты наверное не знаешь, что значит "самобалансирующееся") и хеш-массив. И совершенно точно не знаешь, как это реализовать с действительно хорошей скоростью

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

В целом, если код обрабатывает объёмы данных, если он потенциально ресурсоёмкий - сделай его быстрым, не прогадаешь - такая у меня философия. Ассемблер я использую по нескольким причинам. Во-первых, я им владею. Во-вторых, я специализируюсь на быстрых реализациях; и если существует перспектива создания универсальной библиотеки - лучше уж раз написать и больше не париться. В-третьих, иногда встречаются задачи, которые не реализуемы без ассемблера. Например некоторые части в CrystalLUA.


 
DevilDevil ©   (2013-03-06 16:55) [15]

> Игорь Шевченко ©   (06.03.13 16:51) [13]
> http://www.gunsmoker.ru/2013/01/optimization-basics.html


read [10]


 
Ega23 ©   (2013-03-06 17:03) [16]

ПАФОСПАФОСПАФОСПАФОС!!!


 
DevilDevil ©   (2013-03-06 17:06) [17]

> Ega23 ©   (06.03.13 17:03) [16]

https://lh3.googleusercontent.com/-rWbDB61qQeE/ULbxJzb3qFI/AAAAAAAAE30/KL57A2JVWE0/s604/mantra_rossiyanina.jpg


 
брат Птибурдукова   (2013-03-06 17:09) [18]

пафосГлазамиХакера()™


 
Kerk ©   (2013-03-06 17:09) [19]


> DevilDevil ©   (06.03.13 16:54) [14]

Добавь еще "ты совершенно точно не знаешь асма" и все, ты меня сделал! Возьми с полки пирожок :)


 
Inovet ©   (2013-03-06 17:12) [20]

> [16] Ega23 ©   (06.03.13 17:03)
> ПАФОСПАФОСПАФОСПАФОС!!!

АПОФЕОЗАПОФЕОЗАПОФЕОЗАПОФЕОЗ!!!


 
DevilDevil ©   (2013-03-06 17:13) [21]

> Kerk ©   (06.03.13 17:09) [19]

http://motivatory.ru/img/poster/e3c041ef94.jpg


 
Kerk ©   (2013-03-06 17:14) [22]

Да прекрати уже истерику :)
Ты нереально крут, тут все это уже увидели, даже дебилы вроде меня.


 
DevilDevil ©   (2013-03-06 17:16) [23]

очень хорошо, что ты это признаёшь


 
Kerk ©   (2013-03-06 17:20) [24]

А знаешь что самое смешное? Ты так и не ответил на вопрос из [7] и [12]. Вместо этого ты свалился в тупую истерику. О многом говорит :) Если б тобой двигало что-то серьезнее твоих детсадовских принципов, ты бы легко ответил "вот на такой-то задаче я выигрываю полчаса" (например). Все бы посмотрели, покивали, убедились. Но нет же. Курам на смех.


 
Ega23 ©   (2013-03-06 17:21) [25]


> DevilDevil ©   (06.03.13 17:06) [17]

Это ты вечерами читаешь?


 
DVM ©   (2013-03-06 17:22) [26]

По мне лучше улучшать алгоритмы на основном языке (паскале, си), чем заменять просто ассемблерными вставками то, что якобы медленно работает. Оно и интереснее и пользы больше и поддерживать проще. Ведь если подумать, не так много существует мест, где подобные оптимизации реально нужны.


 
брат Птибурдукова   (2013-03-06 17:25) [27]


> DVM ©   (06.03.13 17:22) [26]
У Зубкова в книжке по асму сие очень доходчиво растолковано, да :-)


 
DevilDevil ©   (2013-03-06 17:29) [28]

> Kerk ©   (06.03.13 17:20) [24]

нет, самое смешное, что я ответил - даже дважды. а ты не увидел
и ещё смешнее, что ты приятельское отношение к себе воспринимаешь как возможность самоутвердиться. причём в вопросе, в котором ты явно слаб

> Ega23 ©   (06.03.13 17:21) [25]

да. чтобы не походить на типичное форумное быдло

> DVM ©   (06.03.13 17:22) [26]

ну так на си производительность в разы бывает быстрее, чем на паскале - зависит от задачи. Только на си программы дольше компилируются, особенно на С++, язык менее удобный. Вот и получается дилема: быстрая разработка или быстрая работа программы. Я выбираю зототую середину: Delphi + оптимизация слабых мест. Ассемблер - это одна из оптимизаций. Которой я не брезгую


 
Jeer ©   (2013-03-06 17:30) [29]

>По мне лучше улучшать алгоритмы на основном языке

+100500

Простой пример - умножение матриц.

Если делать в лоб, да хоть на асме:

procedure Mult_Head(const a,b: Matr; var c: Matr; n: integer);
var
 i,j,k: integer;
 cc: real;
begin
 for i:=0 to n-1 do
   for j:=0 to n-1 do begin
     cc := 0.0;
     for k:=0 to n-1 do  cc := cc + a[i,k]*b[k,j];
     c[i,j] := cc;
   end;
end;

и учесть разное время доступа к строкам и столбцам путем транспонирования:

procedure Mult_Trans(var a,b,c: Matr; n: integer);
var
 i,j,k: integer;
 cc: real;
begin
 for i:=0 to n-1 do
   for j:=0 to i-1 do begin
     cc := b[i,j]; b[i,j] :=  b[j,i]; b[j,i] := cc;
   end;

 for i:=0 to n-1 do
   for j:=0 to n-1 do begin
     cc := 0.0;
     for k:=0 to n-1 do cc := cc + a[i,k]*b[j,k];
     c[i,j] := cc;
   end;
end;

то можем выиграть в 2-4 раза.


 
Kerk ©   (2013-03-06 17:34) [30]


> DevilDevil ©   (06.03.13 17:29) [28]

Да я-то что, мне диагноз в этой ветке уже поставлен несколько раз.
Ты о себе беспокойся. Тяжело наверно быть Д"Артаньяном :)


 
DVM ©   (2013-03-06 17:34) [31]


> DevilDevil ©   (06.03.13 17:29) [28]


> ну так на си производительность в разы бывает быстрее, чем
> на паскале - зависит от задачи.

Это от компилятора в основном зависит, компиляторы си они тоже разные очень.


 
DevilDevil ©   (2013-03-06 17:35) [32]

> Jeer ©   (06.03.13 17:30) [29]
> Простой пример - умножение матриц.


попробуй пожалуйста без ассемблера вызвать функцию System._CopyArray


 
DevilDevil ©   (2013-03-06 17:37) [33]

> DVM ©   (06.03.13 17:34) [31]
> Это от компилятора в основном зависит, компиляторы си они тоже разные очень.

да ладно. Все пользуются майкрософтским (чтобы быстро компилировалось), gcc (бесплатно и сердито) или интеловским (понты + убер скорость)

> Kerk ©   (06.03.13 17:34) [30]

нет, не тяжело


 
Kerk ©   (2013-03-06 17:44) [34]


> DevilDevil ©   (06.03.13 17:37) [33]
> нет, не тяжело

Ну вот и отлично, а то я волновался. Непризнанных гениев нужно беречь.


 
Jeer ©   (2013-03-06 17:45) [35]

>попробуй пожалуйста без ассемблера вызвать функцию System._CopyArray

Я дурью маюсь когда очень сильно приспичит, да и то - тыщу раз еще подумаю.


 
DVM ©   (2013-03-06 17:48) [36]


> DevilDevil ©   (06.03.13 17:37) [33]


> да ладно. Все пользуются майкрософтским (чтобы быстро компилировалось),
>  gcc (бесплатно и сердито) или интеловским (понты + убер
> скорость)

Ну вот ты три уже назвал, прибавь еще от ембаркадеро/борланд компилятор си (многие используют), под MacOS еще свой компилятор, есть еще куча менее известных и все выдают разный код в плане быстродействия, но разница в среднем не в разы, так процентов 10-20. В этом же интервале и компилятор Delphi находится. Уж сколько сравнивали, никакого особенного отставания не было.


 
DevilDevil ©   (2013-03-06 17:48) [37]

> Kerk ©   (06.03.13 17:44) [34]

говорят, всё познаётся в сравнении
на фоне неучей, которые не способны создать самобалансирующееся дерево - да, я гений

а вообще мне хватает заботящихся обо мне людей, так что не волнуйся
всё будет хорошо


 
DevilDevil ©   (2013-03-06 17:50) [38]

> Jeer ©   (06.03.13 17:45) [35]
> Я дурью маюсь когда очень сильно приспичит, да и то - тыщу раз еще подумаю.

получается - ты не способен решить задачу, поставленную топикстартером
потому что правильно использовать CopyArray, а не Move, как посоветовали предшественники


 
DevilDevil ©   (2013-03-06 17:51) [39]

> DVM ©   (06.03.13 17:48) [36]

я тусуюсь на gamedev.ru - там одни сипиписты
и к сожалению на всех проделанных тестах Delphi сильно сливает. В 2 раза в лучшем случае


 
Игорь Шевченко ©   (2013-03-06 17:52) [40]

На этой пафосной ноте дискуссию можно завершить



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2013.07.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.004 c
11-1247619060
Osmiy
2009-07-15 04:51
2013.07.28
Не отрисовывается Bitmap в ToolBar


2-1354195227
ankazh
2012-11-29 17:20
2013.07.28
RichEdit и БД


2-1354379243
Аскалот
2012-12-01 20:27
2013.07.28
Неопознанная ошибка


2-1354043911
adept
2012-11-27 23:18
2013.07.28
Операции с данными в ячейках StringGrid а


15-1362571492
Pit
2013-03-06 16:04
2013.07.28
Раскрутка стека в Eureka log





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский