Как ускорить программу на форте?

classic Classic list List threaded Threaded
28 messages Options
12
Reply | Threaded
Open this post in threaded view
|

Как ускорить программу на форте?

витя ерыгин
Можно ли передавать в пределах слова переменные через регистры? Если да, то какие именно? Если нет, то как ещё можно подъускорить программу на форте?


--
Виктор Ерыгин
------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Как ускорить программу на форте?

Мохов Геннадий
Как раз для этих целей сделан ассемблер встроенный в форт. Смотри описание слова CODE
 
28.03.2016, 18:27, "витя ерыгин" <[hidden email]>:
Можно ли передавать в пределах слова переменные через регистры? Если да, то какие именно? Если нет, то как ещё можно подъускорить программу на форте?


--
Виктор Ерыгин ,

------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140

,

_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev


------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Как ускорить программу на форте?

Ruvim Pinka
In reply to this post by витя ерыгин
2016-03-28 18:27 GMT+03:00 витя ерыгин <[hidden email]>:
Можно ли передавать в пределах слова переменные через регистры? Если да, то какие именно?


Привидите пример такого слова, где хотелось бы передавать параметры через регистры.


"передавать в пределах слова" — это немного двусмысленно, т.к. параметры всегда передаются между словами.

Формат передачи параметров относится к ABI — application binary interface, и этот интерфейс фиксирован. Передавать параметры в одно и то же слово (в один и тот же экземпляр кода) по разным ABI (например, в одном месте через стек, а в другом месте через регистры) — весьма затруднительно. Поэтому, под каждый ABI должен быть сгенерирован свой экземпляр объектного кода.

В SP-Forth/4 первый параметр (верхний) передается через регистр EAX.

Кроме того, при inline-подстановке некоторого слова оптимизатором, передача параметров в это слово через стек может исчезнуть (при этом формируется свой экземпляр кода для исходного слова под конкретное место).



Если нет, то как ещё можно подъускорить программу на форте?

А каков размер программы (или фрагмента), которую требуется ускорить? Измерения проводились? Будет ошибой делать оптимизацию без проведения подробных измерений.

Варианты подускороить в общем известны:
— Оптимизировать алгоритм.
— Написать критичный участок на ассемблере.
— Использовать другой форт-транслятор (например, с более мощным оптимизатором).
— Апгрейдить железо.


--
Ruvim


------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Как ускорить программу на форте?

Ruvim Pinka

2016-03-29 20:04 GMT+03:00 витя ерыгин <[hidden email]>:
Передавать в пределах слова...
Действительно, как то двусмысленно.
Для слова, к примеру, надо три параметра. Чтобы не манипулировать ими на стеке, легче и быстрее их куда-нибудь раскидать. Хоть стек возвратов, как пример. Вот и возникла мысль попытаться засунуть переменную в регистр, и уже потом, когда возникнет необходимость положить переменную обратно на стек. Надеюсь, так быстрее будет работать?

Если кажется, что будет быстрей — надо просто взять и проверить измерением.

Но во первых, лучше бы запусить под профилировщикок на небольшой выборке данных, чтобы понять, какие места кушают больше всего времени. Могу предложить мой старенький велосипед: ~pinka/lib/tools/profiler.f


У меня задача обработка запроса от mysql. Запрос выдаёт десять миллионов строк, потом их обработка и вывод в файл. Запрос длится чуть меньше часа, обработка длится 45 мин, а потом заново. Чем быстрее проходит обработка, тем быстрее выполнится поставленная задача.

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

Поэтому, следует понимать, сколько своего времени вы можете потратить на экономию каждой минуты машинного времени в этой задаче. И, может быть оправдано оптимизировать не только решение на стороне Форта, но и решение на стороне базы данных и SQL. Т.к. иначе, даже если обработка будет длиться 0 минут, 55 минут на запрос все-равно останется, и значит оптимизация в 45% — это теоретический предел.


 
1)  Оптимизировать алгоритм. - всё  просто, оптимизировать некуда


Как вывод в файл происходит? Это же вызов функций Win32 API, на которых следует экономить — буферизировать вывод.
Как происходит обработка данных в плане выделения-освобождения памяти? Эти функции тоже лучше дергать по-реже.
Обработка строк, например поиск подстроки — используются ли быстрые алгоритмы поиска?
И, как верно заметил Валентин насчет параллельной обработки — разве все ядра проца уже задействованы? ;)


2) Написать критичный участок на ассемблере. - плохо знаю ассемблер. Только к нему приступил

Использовать регистры без базовых знаний никак.
Но, есть еще похожий вариант: написать критичный участок на другом языке (например, на Си) и использовать через DLL.


3) Использовать другой форт-транслятор (например, с более мощным оптимизатором). - Какой, если не секрет?

Некоторые коммерческие форт-системы обладают хорошим оптимизатором — например SwiftForth, VFX Forth. Но, еще не известно, будут ли они быстрей — надо проверять и сравнивать на конкретной задаче.


 
4) Апгрейдить железо. - Это не вариант, к несчастью.



--
Ruvim


------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Как ускорить программу на форте?

витя ерыгин
Сам запрос предельно прост
S" select id, pole1 from basa.main where pole1 like '%.%' limit 0 , 10000000" Что здесь оптимизировать?
Относительно вывод в файл. Обнаружил такую хрень
Если файл с таким именем уже создан то результат -1 28 , к примеру, если нет, то 28 0. От результата параметры меняются местами, весело однако.
"Как происходит обработка данных в плане выделения-освобождения памяти?" Да никак, хип не использую Создал себе массив на 5000 байтов туда и складирую строки, и уже обработанный результат на вывод. Обработка строк такова: вставить слева кавычку, вставить саму строку, следом за ней кавычку и точку. Нужно для корректности результатов, ибо что точки, что кавычек может не быть Ищем через SEARCH точку, а потом кавычку,  и уже от неё ищем кавычку снизу. Со стороны много лишних телодвижений, но, блин, корректность результатов. Подстановка слева строки-константы для поиска по FILE-EXISTS, вместо верхней кавычки ставим 0. Найден путь? Хрен с ним, не найден запись в файл. Вот так вот в общих чертах. Код на работе, завтра принесу.

"написать критичный участок на другом языке (например, на Си)"
???
Си хороший язык, быстрый. А за счёт чего интересно? Манипуляций со стеком там меньше. Грубо говоря pick и всеобщий drop. Грубо говоря. Это только мои предположения, что там ещё для меня полный х.з.

Среда, 30 марта 2016, 2:29 +04:00 от Ruvim Pinka <[hidden email]>:


2016-03-29 20:04 GMT+03:00 витя ерыгин <vitai96@...>:
Передавать в пределах слова...
Действительно, как то двусмысленно.
Для слова, к примеру, надо три параметра. Чтобы не манипулировать ими на стеке, легче и быстрее их куда-нибудь раскидать. Хоть стек возвратов, как пример. Вот и возникла мысль попытаться засунуть переменную в регистр, и уже потом, когда возникнет необходимость положить переменную обратно на стек. Надеюсь, так быстрее будет работать?

Если кажется, что будет быстрей — надо просто взять и проверить измерением.

Но во первых, лучше бы запусить под профилировщикок на небольшой выборке данных, чтобы понять, какие места кушают больше всего времени. Могу предложить мой старенький велосипед: ~pinka/lib/tools/profiler.f


У меня задача обработка запроса от mysql. Запрос выдаёт десять миллионов строк, потом их обработка и вывод в файл. Запрос длится чуть меньше часа, обработка длится 45 мин, а потом заново. Чем быстрее проходит обработка, тем быстрее выполнится поставленная задача.

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

Поэтому, следует понимать, сколько своего времени вы можете потратить на экономию каждой минуты машинного времени в этой задаче. И, может быть оправдано оптимизировать не только решение на стороне Форта, но и решение на стороне базы данных и SQL. Т.к. иначе, даже если обработка будет длиться 0 минут, 55 минут на запрос все-равно останется, и значит оптимизация в 45% — это теоретический предел.


 
1)  Оптимизировать алгоритм. - всё  просто, оптимизировать некуда


Как вывод в файл происходит? Это же вызов функций Win32 API, на которых следует экономить — буферизировать вывод.
Как происходит обработка данных в плане выделения-освобождения памяти? Эти функции тоже лучше дергать по-реже.
Обработка строк, например поиск подстроки — используются ли быстрые алгоритмы поиска?
И, как верно заметил Валентин насчет параллельной обработки — разве все ядра проца уже задействованы? ;)


2) Написать критичный участок на ассемблере. - плохо знаю ассемблер. Только к нему приступил

Использовать регистры без базовых знаний никак.
Но, есть еще похожий вариант: написать критичный участок на другом языке (например, на Си) и использовать через DLL.


3) Использовать другой форт-транслятор (например, с более мощным оптимизатором). - Какой, если не секрет?

Некоторые коммерческие форт-системы обладают хорошим оптимизатором — например SwiftForth, VFX Forth. Но, еще не известно, будут ли они быстрей — надо проверять и сравнивать на конкретной задаче.


 
4) Апгрейдить железо. - Это не вариант, к несчастью.



--
Ruvim

------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
Spf-dev@...
https://lists.sourceforge.net/lists/listinfo/spf-dev


------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Как ускорить программу на форте?

Бомбин Валентин
Как минимум - like '%.%'
Его же - как максимум

--
С уважением, Бомбин Валентин
тел 79114208298


30.03.2016, 19:01, "витя ерыгин" <[hidden email]>:

> Сам запрос предельно прост
> S" select id, pole1 from basa.main where pole1 like '%.%' limit 0 , 10000000" Что здесь оптимизировать?
> Относительно вывод в файл. Обнаружил такую хрень
> Если файл с таким именем уже создан то результат -1 28 , к примеру, если нет, то 28 0. От результата параметры меняются местами, весело однако.
> "Как происходит обработка данных в плане выделения-освобождения памяти?" Да никак, хип не использую Создал себе массив на 5000 байтов туда и складирую строки, и уже обработанный результат на вывод. Обработка строк такова: вставить слева кавычку, вставить саму строку, следом за ней кавычку и точку. Нужно для корректности результатов, ибо что точки, что кавычек может не быть Ищем через SEARCH точку, а потом кавычку,  и уже от неё ищем кавычку снизу. Со стороны много лишних телодвижений, но, блин, корректность результатов. Подстановка слева строки-константы для поиска по FILE-EXISTS, вместо верхней кавычки ставим 0. Найден путь? Хрен с ним, не найден запись в файл. Вот так вот в общих чертах. Код на работе, завтра принесу.
>
> "написать критичный участок на другом языке (например, на Си)"
> ???
> Си хороший язык, быстрый. А за счёт чего интересно? Манипуляций со стеком там меньше. Грубо говоря pick и всеобщий drop. Грубо говоря. Это только мои предположения, что там ещё для меня полный х.з.
>
>> Среда, 30 марта 2016, 2:29 +04:00 от Ruvim Pinka <[hidden email]>:
>>
>> 2016-03-29 20:04 GMT+03:00 витя ерыгин <[hidden email]>:
>>> Передавать в пределах слова...
>>> Действительно, как то двусмысленно.
>>> Для слова, к примеру, надо три параметра. Чтобы не манипулировать ими на стеке, легче и быстрее их куда-нибудь раскидать. Хоть стек возвратов, как пример. Вот и возникла мысль попытаться засунуть переменную в регистр, и уже потом, когда возникнет необходимость положить переменную обратно на стек. Надеюсь, так быстрее будет работать?
>>
>> Если кажется, что будет быстрей — надо просто взять и проверить измерением.
>>
>> Но во первых, лучше бы запусить под профилировщикок на небольшой выборке данных, чтобы понять, какие места кушают больше всего времени. Могу предложить мой старенький велосипед: ~pinka/lib/tools/profiler.f
>>
>>> У меня задача обработка запроса от mysql. Запрос выдаёт десять миллионов строк, потом их обработка и вывод в файл. Запрос длится чуть меньше часа, обработка длится 45 мин, а потом заново. Чем быстрее проходит обработка, тем быстрее выполнится поставленная задача.
>>
>> Это вопрос выгоды и рентабельности: выбор делается между разработкой (суммарным временем человека-программиста) и выполнением (суммарное время машины), помноженной на экономический эффект.
>>
>> Поэтому, следует понимать, сколько своего времени вы можете потратить на экономию каждой минуты машинного времени в этой задаче. И, может быть оправдано оптимизировать не только решение на стороне Форта, но и решение на стороне базы данных и SQL. Т.к. иначе, даже если обработка будет длиться 0 минут, 55 минут на запрос все-равно останется, и значит оптимизация в 45% — это теоретический предел.
>>
>>> 1)  Оптимизировать алгоритм. - всё  просто, оптимизировать некуда
>>
>> Как вывод в файл происходит? Это же вызов функций Win32 API, на которых следует экономить — буферизировать вывод.
>> Как происходит обработка данных в плане выделения-освобождения памяти? Эти функции тоже лучше дергать по-реже.
>> Обработка строк, например поиск подстроки — используются ли быстрые алгоритмы поиска?
>> И, как верно заметил Валентин насчет параллельной обработки — разве все ядра проца уже задействованы? ;)
>>
>>> 2) Написать критичный участок на ассемблере. - плохо знаю ассемблер. Только к нему приступил
>>
>> Использовать регистры без базовых знаний никак.
>> Но, есть еще похожий вариант: написать критичный участок на другом языке (например, на Си) и использовать через DLL.
>>
>>> 3) Использовать другой форт-транслятор (например, с более мощным оптимизатором). - Какой, если не секрет?
>>
>> Некоторые коммерческие форт-системы обладают хорошим оптимизатором — например SwiftForth, VFX Forth. Но, еще не известно, будут ли они быстрей — надо проверять и сравнивать на конкретной задаче.
>>
>>> 4) Апгрейдить железо. - Это не вариант, к несчастью.
>>
>> --
>> Ruvim
>>
>> ------------------------------------------------------------------------------
>> Transform Data into Opportunity.
>> Accelerate data analysis in your applications with
>> Intel Data Analytics Acceleration Library.
>> Click to learn more.
>> http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
>>
>> _______________________________________________
>> Spf-dev mailing list
>> [hidden email]
>> https://lists.sourceforge.net/lists/listinfo/spf-dev
>
> ,
>
> ------------------------------------------------------------------------------
> Transform Data into Opportunity.
> Accelerate data analysis in your applications with
> Intel Data Analytics Acceleration Library.
> Click to learn more.
> http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
> ,
>
> _______________________________________________
> Spf-dev mailing list
> [hidden email]
> https://lists.sourceforge.net/lists/listinfo/spf-dev
------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Как ускорить программу на форте?

Бомбин Валентин
In reply to this post by витя ерыгин
Чуть больше про like '%.%'
Как это работает - сервер БД не может на этом условии использовать никаких индексов. От слова вообще. like - это использование regexp'a,  а regexp - это построение DFA и применение его к тексту. в общем - очень-очень-очень медленно. ОФИГЕННО медленно.
Как исправить?
1 путь - если можешь поменять структуру таблицы - добавь себе поле pointPosition с типом integer, в тригере onupdate/oninsert добавь расчет позиции этой точки который вернет целое число и положит в pointPosition это значение. Сделай индекс по этому полю.
твой запрос примет вид
" select id, pole1 from basa.main where pointPosition > 0' limit 0 , 10000000"
дальше - все как у тебя сейчас сделано.

2 путь - кривой, но для теста покатит -
" select id, pole1 from basa.main where MID(pole1,1,1) = '.' limit 0 , 10000000
union all
select id, pole1 from basa.main where MID(pole1,2,1) = '.' limit 0 , 10000000
union all
select id, pole1 from basa.main where MID(pole1,3,1) = '.' limit 0 , 10000000"
и т.д. - сколько там тебе длина нужна

Про обработку - опять же - не видя данных сказать что там делается - сложно, но как вариант - предложил бы создать в тригере oninsert|onupdate сделать запись в отдельную табличку куда класть уже обработанную строку. так что бы потом твой запрос свелся бы к простому селекту, без условий



--
С уважением, Бомбин Валентин
тел 79114208298


30.03.2016, 19:01, "витя ерыгин" <[hidden email]>:

> Сам запрос предельно прост
> S" select id, pole1 from basa.main where pole1 like '%.%' limit 0 , 10000000" Что здесь оптимизировать?
> Относительно вывод в файл. Обнаружил такую хрень
> Если файл с таким именем уже создан то результат -1 28 , к примеру, если нет, то 28 0. От результата параметры меняются местами, весело однако.
> "Как происходит обработка данных в плане выделения-освобождения памяти?" Да никак, хип не использую Создал себе массив на 5000 байтов туда и складирую строки, и уже обработанный результат на вывод. Обработка строк такова: вставить слева кавычку, вставить саму строку, следом за ней кавычку и точку. Нужно для корректности результатов, ибо что точки, что кавычек может не быть Ищем через SEARCH точку, а потом кавычку,  и уже от неё ищем кавычку снизу. Со стороны много лишних телодвижений, но, блин, корректность результатов. Подстановка слева строки-константы для поиска по FILE-EXISTS, вместо верхней кавычки ставим 0. Найден путь? Хрен с ним, не найден запись в файл. Вот так вот в общих чертах. Код на работе, завтра принесу.
>
> "написать критичный участок на другом языке (например, на Си)"
> ???
> Си хороший язык, быстрый. А за счёт чего интересно? Манипуляций со стеком там меньше. Грубо говоря pick и всеобщий drop. Грубо говоря. Это только мои предположения, что там ещё для меня полный х.з.
>
>> Среда, 30 марта 2016, 2:29 +04:00 от Ruvim Pinka <[hidden email]>:
>>
>> 2016-03-29 20:04 GMT+03:00 витя ерыгин <[hidden email]>:
>>> Передавать в пределах слова...
>>> Действительно, как то двусмысленно.
>>> Для слова, к примеру, надо три параметра. Чтобы не манипулировать ими на стеке, легче и быстрее их куда-нибудь раскидать. Хоть стек возвратов, как пример. Вот и возникла мысль попытаться засунуть переменную в регистр, и уже потом, когда возникнет необходимость положить переменную обратно на стек. Надеюсь, так быстрее будет работать?
>>
>> Если кажется, что будет быстрей — надо просто взять и проверить измерением.
>>
>> Но во первых, лучше бы запусить под профилировщикок на небольшой выборке данных, чтобы понять, какие места кушают больше всего времени. Могу предложить мой старенький велосипед: ~pinka/lib/tools/profiler.f
>>
>>> У меня задача обработка запроса от mysql. Запрос выдаёт десять миллионов строк, потом их обработка и вывод в файл. Запрос длится чуть меньше часа, обработка длится 45 мин, а потом заново. Чем быстрее проходит обработка, тем быстрее выполнится поставленная задача.
>>
>> Это вопрос выгоды и рентабельности: выбор делается между разработкой (суммарным временем человека-программиста) и выполнением (суммарное время машины), помноженной на экономический эффект.
>>
>> Поэтому, следует понимать, сколько своего времени вы можете потратить на экономию каждой минуты машинного времени в этой задаче. И, может быть оправдано оптимизировать не только решение на стороне Форта, но и решение на стороне базы данных и SQL. Т.к. иначе, даже если обработка будет длиться 0 минут, 55 минут на запрос все-равно останется, и значит оптимизация в 45% — это теоретический предел.
>>
>>> 1)  Оптимизировать алгоритм. - всё  просто, оптимизировать некуда
>>
>> Как вывод в файл происходит? Это же вызов функций Win32 API, на которых следует экономить — буферизировать вывод.
>> Как происходит обработка данных в плане выделения-освобождения памяти? Эти функции тоже лучше дергать по-реже.
>> Обработка строк, например поиск подстроки — используются ли быстрые алгоритмы поиска?
>> И, как верно заметил Валентин насчет параллельной обработки — разве все ядра проца уже задействованы? ;)
>>
>>> 2) Написать критичный участок на ассемблере. - плохо знаю ассемблер. Только к нему приступил
>>
>> Использовать регистры без базовых знаний никак.
>> Но, есть еще похожий вариант: написать критичный участок на другом языке (например, на Си) и использовать через DLL.
>>
>>> 3) Использовать другой форт-транслятор (например, с более мощным оптимизатором). - Какой, если не секрет?
>>
>> Некоторые коммерческие форт-системы обладают хорошим оптимизатором — например SwiftForth, VFX Forth. Но, еще не известно, будут ли они быстрей — надо проверять и сравнивать на конкретной задаче.
>>
>>> 4) Апгрейдить железо. - Это не вариант, к несчастью.
>>
>> --
>> Ruvim
>>
>> ------------------------------------------------------------------------------
>> Transform Data into Opportunity.
>> Accelerate data analysis in your applications with
>> Intel Data Analytics Acceleration Library.
>> Click to learn more.
>> http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
>>
>> _______________________________________________
>> Spf-dev mailing list
>> [hidden email]
>> https://lists.sourceforge.net/lists/listinfo/spf-dev
>
> ,
>
> ------------------------------------------------------------------------------
> Transform Data into Opportunity.
> Accelerate data analysis in your applications with
> Intel Data Analytics Acceleration Library.
> Click to learn more.
> http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
> ,
>
> _______________________________________________
> Spf-dev mailing list
> [hidden email]
> https://lists.sourceforge.net/lists/listinfo/spf-dev
------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Как ускорить программу на форте?

витя ерыгин

https://yadi.sk/d/eGBVz23MqdPc4 
Вот мои потуги. Готов выслушать все ваши замечания , предложения, гневные отзывы


Среда, 30 марта 2016, 20:48 +04:00 от Бомбин Валентин <[hidden email]>:

Чуть больше про like '%.%'
Как это работает - сервер БД не может на этом условии использовать никаких индексов. От слова вообще. like - это использование regexp'a, а regexp - это построение DFA и применение его к тексту. в общем - очень-очень-очень медленно. ОФИГЕННО медленно.
Как исправить?
1 путь - если можешь поменять структуру таблицы - добавь себе поле pointPosition с типом integer, в тригере onupdate/oninsert добавь расчет позиции этой точки который вернет целое число и положит в pointPosition это значение. Сделай индекс по этому полю.
твой запрос примет вид
" select id, pole1 from basa.main where pointPosition > 0' limit 0 , 10000000"
дальше - все как у тебя сейчас сделано.

2 путь - кривой, но для теста покатит -
" select id, pole1 from basa.main where MID(pole1,1,1) = '.' limit 0 , 10000000
union all
select id, pole1 from basa.main where MID(pole1,2,1) = '.' limit 0 , 10000000
union all
select id, pole1 from basa.main where MID(pole1,3,1) = '.' limit 0 , 10000000"
и т.д. - сколько там тебе длина нужна

Про обработку - опять же - не видя данных сказать что там делается - сложно, но как вариант - предложил бы создать в тригере oninsert|onupdate сделать запись в отдельную табличку куда класть уже обработанную строку. так что бы потом твой запрос свелся бы к простому селекту, без условий



--
С уважением, Бомбин Валентин
тел 79114208298


30.03.2016, 19:01, "витя ерыгин" <vitai96@...>:
> Сам запрос предельно прост
> S" select id, pole1 from basa.main where pole1 like '%.%' limit 0 , 10000000" Что здесь оптимизировать?
> Относительно вывод в файл. Обнаружил такую хрень
> Если файл с таким именем уже создан то результат -1 28 , к примеру, если нет, то 28 0. От результата параметры меняются местами, весело однако.
> "Как происходит обработка данных в плане выделения-освобождения памяти?" Да никак, хип не использую Создал себе массив на 5000 байтов туда и складирую строки, и уже обработанный результат на вывод. Обработка строк такова: вставить слева кавычку, вставить саму строку, следом за ней кавычку и точку. Нужно для корректности результатов, ибо что точки, что кавычек может не быть Ищем через SEARCH точку, а потом кавычку,  и уже от неё ищем кавычку снизу. Со стороны много лишних телодвижений, но, блин, корректность результатов. Подстановка слева строки-константы для поиска по FILE-EXISTS, вместо верхней кавычки ставим 0. Найден путь? Хрен с ним, не найден запись в файл. Вот так вот в общих чертах. Код на работе, завтра принесу.
>
> "написать критичный участок на другом языке (например, на Си)"
> ???
> Си хороший язык, быстрый. А за счёт чего интересно? Манипуляций со стеком там меньше. Грубо говоря pick и всеобщий drop. Грубо говоря. Это только мои предположения, что там ещё для меня полный х.з.
>
>> Среда, 30 марта 2016, 2:29 +04:00 от Ruvim Pinka <ruvim.pinka@...>:
>>
>> 2016-03-29 20:04 GMT+03:00 витя ерыгин <vitai96@...>:
>>> Передавать в пределах слова...
>>> Действительно, как то двусмысленно.
>>> Для слова, к примеру, надо три параметра. Чтобы не манипулировать ими на стеке, легче и быстрее их куда-нибудь раскидать. Хоть стек возвратов, как пример. Вот и возникла мысль попытаться засунуть переменную в регистр, и уже потом, когда возникнет необходимость положить переменную обратно на стек. Надеюсь, так быстрее будет работать?
>>
>> Если кажется, что будет быстрей — надо просто взять и проверить измерением.
>>
>> Но во первых, лучше бы запусить под профилировщикок на небольшой выборке данных, чтобы понять, какие места кушают больше всего времени. Могу предложить мой старенький велосипед: ~pinka/lib/tools/profiler.f
>>
>>> У меня задача обработка запроса от mysql. Запрос выдаёт десять миллионов строк, потом их обработка и вывод в файл. Запрос длится чуть меньше часа, обработка длится 45 мин, а потом заново. Чем быстрее проходит обработка, тем быстрее выполнится поставленная задача.
>>
>> Это вопрос выгоды и рентабельности: выбор делается между разработкой (суммарным временем человека-программиста) и выполнением (суммарное время машины), помноженной на экономический эффект.
>>
>> Поэтому, следует понимать, сколько своего времени вы можете потратить на экономию каждой минуты машинного времени в этой задаче. И, может быть оправдано оптимизировать не только решение на стороне Форта, но и решение на стороне базы данных и SQL. Т.к. иначе, даже если обработка будет длиться 0 минут, 55 минут на запрос все-равно останется, и значит оптимизация в 45% — это теоретический предел.
>>
>>> 1)  Оптимизировать алгоритм. - всё  просто, оптимизировать некуда
>>
>> Как вывод в файл происходит? Это же вызов функций Win32 API, на которых следует экономить — буферизировать вывод.
>> Как происходит обработка данных в плане выделения-освобождения памяти? Эти функции тоже лучше дергать по-реже.
>> Обработка строк, например поиск подстроки — используются ли быстрые алгоритмы поиска?
>> И, как верно заметил Валентин насчет параллельной обработки — разве все ядра проца уже задействованы? ;)
>>
>>> 2) Написать критичный участок на ассемблере. - плохо знаю ассемблер. Только к нему приступил
>>
>> Использовать регистры без базовых знаний никак.
>> Но, есть еще похожий вариант: написать критичный участок на другом языке (например, на Си) и использовать через DLL.
>>
>>> 3) Использовать другой форт-транслятор (например, с более мощным оптимизатором). - Какой, если не секрет?
>>
>> Некоторые коммерческие форт-системы обладают хорошим оптимизатором — например SwiftForth, VFX Forth. Но, еще не известно, будут ли они быстрей — надо проверять и сравнивать на конкретной задаче.
>>
>>> 4) Апгрейдить железо. - Это не вариант, к несчастью.
>>
>> --
>> Ruvim
>>
>> ------------------------------------------------------------------------------
>> Transform Data into Opportunity.
>> Accelerate data analysis in your applications with
>> Intel Data Analytics Acceleration Library.
>> Click to learn more.
>> http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
>>
>> _______________________________________________
>> Spf-dev mailing list
>> Spf-dev@...
>> https://lists.sourceforge.net/lists/listinfo/spf-dev
>
> ,
>
> ------------------------------------------------------------------------------
> Transform Data into Opportunity.
> Accelerate data analysis in your applications with
> Intel Data Analytics Acceleration Library.
> Click to learn more.
> http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
> ,
>
> _______________________________________________
> Spf-dev mailing list
> Spf-dev@...
> https://lists.sourceforge.net/lists/listinfo/spf-dev


------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Как ускорить программу на форте?

Ruvim Pinka
2016-03-31 18:54 GMT+03:00 витя ерыгин <[hidden email]>:

https://yadi.sk/d/eGBVz23MqdPc4 
Вот мои потуги. Готов выслушать все ваши замечания , предложения, гневные отзывы


А почему не подошли штатные локальные переменные lib/ext/locals.f ?

 
30.03.2016, 19:01, "витя ерыгин" <vitai96@...>:
> Относительно вывод в файл. Обнаружил такую хрень
> Если файл с таким именем уже создан то результат -1 28 , к примеру, если нет, то 28 0. От результата параметры меняются местами, весело однако.
Скорей всего, эта ошибка в вашем коде.

Например, тут:
S" RESULT-F1.TXT" 4 CREATE-FILE DUP 0= IF DROP THEN
TO IND-FF1
при ошибке создания файла IND-FF1 будет содержать код ошибки, а не хэндл.

Должно быть так:
S" RESULT-F1.TXT" W/O CREATE-FILE THROW TO IND-FF1


--
Ruvim


------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Как ускорить программу на форте?

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



Четверг, 31 марта 2016, 23:23 +04:00 от Ruvim Pinka <[hidden email]>:

2016-03-31 18:54 GMT+03:00 витя ерыгин <vitai96@...>:

https://yadi.sk/d/eGBVz23MqdPc4 
Вот мои потуги. Готов выслушать все ваши замечания , предложения, гневные отзывы


А почему не подошли штатные локальные переменные lib/ext/locals.f ?

 
30.03.2016, 19:01, "витя ерыгин" <vitai96@...>:
> Относительно вывод в файл. Обнаружил такую хрень
> Если файл с таким именем уже создан то результат -1 28 , к примеру, если нет, то 28 0. От результата параметры меняются местами, весело однако.
Скорей всего, эта ошибка в вашем коде.

Например, тут:
S" RESULT-F1.TXT" 4 CREATE-FILE DUP 0= IF DROP THEN
TO IND-FF1
при ошибке создания файла IND-FF1 будет содержать код ошибки, а не хэндл.

Должно быть так:
S" RESULT-F1.TXT" W/O CREATE-FILE THROW TO IND-FF1


--
Ruvim

------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
Spf-dev@...
https://lists.sourceforge.net/lists/listinfo/spf-dev


------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev

=?UTF-8?B?U3BmLS0uUE5H?= (11K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: Как ускорить программу на форте?

Бомбин Валентин
Я бы еще раз тебе посоветовал - измени структуру БД. И это даст тебе максимальное ускорение.



--
С уважением, Бомбин Валентин
тел 79114208298


01.04.2016, 17:14, "витя ерыгин" <[hidden email]>:

> Насчёт локалок, считаю чем проще в исполнении решение тем оно быстрее. Да и кто-то писал, что использование локалок тормозит программу на 10-20%
> Насчёт вывода в файл непонятка однако. см, снимок
>
>> Четверг, 31 марта 2016, 23:23 +04:00 от Ruvim Pinka <[hidden email]>:
>>
>> 2016-03-31 18:54 GMT+03:00 витя ерыгин <[hidden email]>:
>>> https://yadi.sk/d/eGBVz23MqdPc4
>>> Вот мои потуги. Готов выслушать все ваши замечания , предложения, гневные отзывы
>>
>> А почему не подошли штатные локальные переменные lib/ext/locals.f ?
>>
>>>> 30.03.2016, 19:01, "витя ерыгин" <[hidden email]>:
>>>>> Относительно вывод в файл. Обнаружил такую хрень
>>>>> Если файл с таким именем уже создан то результат -1 28 , к примеру, если нет, то 28 0. От результата параметры меняются местами, весело однако.
>> Скорей всего, эта ошибка в вашем коде.
>>
>> Например, тут:
>> S" RESULT-F1.TXT" 4 CREATE-FILE DUP 0= IF DROP THEN
>> TO IND-FF1
>> при ошибке создания файла IND-FF1 будет содержать код ошибки, а не хэндл.
>>
>> Должно быть так:
>> S" RESULT-F1.TXT" W/O CREATE-FILE THROW TO IND-FF1
>>
>> --
>> Ruvim
>>
>> ------------------------------------------------------------------------------
>> Transform Data into Opportunity.
>> Accelerate data analysis in your applications with
>> Intel Data Analytics Acceleration Library.
>> Click to learn more.
>> http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
>>
>> _______________________________________________
>> Spf-dev mailing list
>> [hidden email]
>> https://lists.sourceforge.net/lists/listinfo/spf-dev
>
> ,
>
> ------------------------------------------------------------------------------
> Transform Data into Opportunity.
> Accelerate data analysis in your applications with
> Intel Data Analytics Acceleration Library.
> Click to learn more.
> http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
> ,
>
> _______________________________________________
> Spf-dev mailing list
> [hidden email]
> https://lists.sourceforge.net/lists/listinfo/spf-dev

------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Как ускорить программу на форте?

Ruvim Pinka
In reply to this post by витя ерыгин
2016-04-01 17:13 GMT+03:00 витя ерыгин <[hidden email]>:
Насчёт локалок, считаю чем проще в исполнении решение тем оно быстрее. Да и кто-то писал, что использование локалок тормозит программу на 10-20%

Проще использовать готовое решение — и да, это обычно быстрей на этапе разработки.
Насчет тормозов — следует проверять и измерять.

 
Насчёт вывода в файл непонятка однако. см, снимок

Во первых, что такое 4 ?  Там должна быть константа R/O, R/W или W/O — каждая из которых отлична от 4.

Во вторых — на скриншоте все как положено:
( 68 0 ) после первой операции, где 0 — код успешности операции, 68 — хэндл;
( -1 32 ) после второй операции, где 32 — код ошибки, -1 — произвольное значение.


--
Ruvim


------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Как ускорить программу на форте?

Королев Виктор
В свое время, тоже был озабочен скоростью, проверял на использования чтения записи locals, value  и обычных переменных variable, особой разницы не заметил, тесты не сохранились, всего доли процентов... основной тормоз это вывод в файл и отображение на экране, ну и немного перемещение массивов данных, вот бы не плохо было бы в spf MMX прикрутить...
 
01.04.2016, 18:09, "Ruvim Pinka" <[hidden email]>:
2016-04-01 17:13 GMT+03:00 витя ерыгин <[hidden email]>:
Насчёт локалок, считаю чем проще в исполнении решение тем оно быстрее. Да и кто-то писал, что использование локалок тормозит программу на 10-20%
 
Проще использовать готовое решение — и да, это обычно быстрей на этапе разработки.
Насчет тормозов — следует проверять и измерять.

 
Насчёт вывода в файл непонятка однако. см, снимок
 
Во первых, что такое 4 ?  Там должна быть константа R/O, R/W или W/O — каждая из которых отлична от 4.
 
Во вторых — на скриншоте все как положено:
( 68 0 ) после первой операции, где 0 — код успешности операции, 68 — хэндл;
( -1 32 ) после второй операции, где 32 — код ошибки, -1 — произвольное значение.


--
Ruvim

,

------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140

,

_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev


------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Как ускорить программу на форте?

Мохов Геннадий
В первую очередь, надо разрисовать алгоритм. Найти циклы и именно их
оптимизировать. Максимально избавится от операций с файлами типа FILE-EXISTS,
и операций записи и чтения.

Если проверять файл на существование не обязательно, то лучше от этого
отказаться.
------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Как ускорить программу на форте?

Королев Виктор
In reply to this post by витя ерыгин
Мелким взглядом... например в mysql-RAB.f, уберешь все TYPE, ." xx", CR  и т.п подобное скорость в сотни раз возрастет.
Ну и результат накапливать в памяти, затем WRINE-FILE, как вариант использовать отображение файла в память, к примеру библиотеку mapfile.f от ygreks
 
31.03.2016, 18:55, "витя ерыгин" <[hidden email]>:

https://yadi.sk/d/eGBVz23MqdPc4 
Вот мои потуги. Готов выслушать все ваши замечания , предложения, гневные отзывы


Среда, 30 марта 2016, 20:48 +04:00 от Бомбин Валентин <[hidden email]>:

Чуть больше про like '%.%'
Как это работает - сервер БД не может на этом условии использовать никаких индексов. От слова вообще. like - это использование regexp'a, а regexp - это построение DFA и применение его к тексту. в общем - очень-очень-очень медленно. ОФИГЕННО медленно.
Как исправить?
1 путь - если можешь поменять структуру таблицы - добавь себе поле pointPosition с типом integer, в тригере onupdate/oninsert добавь расчет позиции этой точки который вернет целое число и положит в pointPosition это значение. Сделай индекс по этому полю.
твой запрос примет вид
" select id, pole1 from basa.main where pointPosition > 0' limit 0 , 10000000"
дальше - все как у тебя сейчас сделано.

2 путь - кривой, но для теста покатит -
" select id, pole1 from basa.main where MID(pole1,1,1) = '.' limit 0 , 10000000
union all
select id, pole1 from basa.main where MID(pole1,2,1) = '.' limit 0 , 10000000
union all
select id, pole1 from basa.main where MID(pole1,3,1) = '.' limit 0 , 10000000"
и т.д. - сколько там тебе длина нужна

Про обработку - опять же - не видя данных сказать что там делается - сложно, но как вариант - предложил бы создать в тригере oninsert|onupdate сделать запись в отдельную табличку куда класть уже обработанную строку. так что бы потом твой запрос свелся бы к простому селекту, без условий



--
С уважением, Бомбин Валентин
тел 79114208298


30.03.2016, 19:01, "витя ерыгин" <vitai96@...>:
> Сам запрос предельно прост
> S" select id, pole1 from basa.main where pole1 like '%.%' limit 0 , 10000000" Что здесь оптимизировать?
> Относительно вывод в файл. Обнаружил такую хрень
> Если файл с таким именем уже создан то результат -1 28 , к примеру, если нет, то 28 0. От результата параметры меняются местами, весело однако.
> "Как происходит обработка данных в плане выделения-освобождения памяти?" Да никак, хип не использую Создал себе массив на 5000 байтов туда и складирую строки, и уже обработанный результат на вывод. Обработка строк такова: вставить слева кавычку, вставить саму строку, следом за ней кавычку и точку. Нужно для корректности результатов, ибо что точки, что кавычек может не быть Ищем через SEARCH точку, а потом кавычку,  и уже от неё ищем кавычку снизу. Со стороны много лишних телодвижений, но, блин, корректность результатов. Подстановка слева строки-константы для поиска по FILE-EXISTS, вместо верхней кавычки ставим 0. Найден путь? Хрен с ним, не найден запись в файл. Вот так вот в общих чертах. Код на работе, завтра принесу.
>
> "написать критичный участок на другом языке (например, на Си)"
> ???
> Си хороший язык, быстрый. А за счёт чего интересно? Манипуляций со стеком там меньше. Грубо говоря pick и всеобщий drop. Грубо говоря. Это только мои предположения, что там ещё для меня полный х.з.
>
>> Среда, 30 марта 2016, 2:29 +04:00 от Ruvim Pinka <ruvim.pinka@...>:
>>
>> 2016-03-29 20:04 GMT+03:00 витя ерыгин <vitai96@...>:
>>> Передавать в пределах слова...
>>> Действительно, как то двусмысленно.
>>> Для слова, к примеру, надо три параметра. Чтобы не манипулировать ими на стеке, легче и быстрее их куда-нибудь раскидать. Хоть стек возвратов, как пример. Вот и возникла мысль попытаться засунуть переменную в регистр, и уже потом, когда возникнет необходимость положить переменную обратно на стек. Надеюсь, так быстрее будет работать?
>>
>> Если кажется, что будет быстрей — надо просто взять и проверить измерением.
>>
>> Но во первых, лучше бы запусить под профилировщикок на небольшой выборке данных, чтобы понять, какие места кушают больше всего времени. Могу предложить мой старенький велосипед: ~pinka/lib/tools/profiler.f
>>
>>> У меня задача обработка запроса от mysql. Запрос выдаёт десять миллионов строк, потом их обработка и вывод в файл. Запрос длится чуть меньше часа, обработка длится 45 мин, а потом заново. Чем быстрее проходит обработка, тем быстрее выполнится поставленная задача.
>>
>> Это вопрос выгоды и рентабельности: выбор делается между разработкой (суммарным временем человека-программиста) и выполнением (суммарное время машины), помноженной на экономический эффект.
>>
>> Поэтому, следует понимать, сколько своего времени вы можете потратить на экономию каждой минуты машинного времени в этой задаче. И, может быть оправдано оптимизировать не только решение на стороне Форта, но и решение на стороне базы данных и SQL. Т.к. иначе, даже если обработка будет длиться 0 минут, 55 минут на запрос все-равно останется, и значит оптимизация в 45% — это теоретический предел.
>>
>>> 1)  Оптимизировать алгоритм. - всё  просто, оптимизировать некуда
>>
>> Как вывод в файл происходит? Это же вызов функций Win32 API, на которых следует экономить — буферизировать вывод.
>> Как происходит обработка данных в плане выделения-освобождения памяти? Эти функции тоже лучше дергать по-реже.
>> Обработка строк, например поиск подстроки — используются ли быстрые алгоритмы поиска?
>> И, как верно заметил Валентин насчет параллельной обработки — разве все ядра проца уже задействованы? ;)
>>
>>> 2) Написать критичный участок на ассемблере. - плохо знаю ассемблер. Только к нему приступил
>>
>> Использовать регистры без базовых знаний никак.
>> Но, есть еще похожий вариант: написать критичный участок на другом языке (например, на Си) и использовать через DLL.
>>
>>> 3) Использовать другой форт-транслятор (например, с более мощным оптимизатором). - Какой, если не секрет?
>>
>> Некоторые коммерческие форт-системы обладают хорошим оптимизатором — например SwiftForth, VFX Forth. Но, еще не известно, будут ли они быстрей — надо проверять и сравнивать на конкретной задаче.
>>
>>> 4) Апгрейдить железо. - Это не вариант, к несчастью.
>>
>> --
>> Ruvim
>>
>> ------------------------------------------------------------------------------
>> Transform Data into Opportunity.
>> Accelerate data analysis in your applications with
>> Intel Data Analytics Acceleration Library.
>> Click to learn more.
>> http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
>>
>> _______________________________________________
>> Spf-dev mailing list
>> Spf-dev@...
>> https://lists.sourceforge.net/lists/listinfo/spf-dev
>
> ,
>
> ------------------------------------------------------------------------------
> Transform Data into Opportunity.
> Accelerate data analysis in your applications with
> Intel Data Analytics Acceleration Library.
> Click to learn more.
> http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
> ,
>
> _______________________________________________
> Spf-dev mailing list
> Spf-dev@...
> https://lists.sourceforge.net/lists/listinfo/spf-dev

,

------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140

,

_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev


------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Как ускорить программу на форте?

Королев Виктор
In reply to this post by витя ерыгин
Да и работа со строками намного удобнее, используя STR5.f , чем  V-MOVE и далее в mysql-RAB.f
 
31.03.2016, 18:55, "витя ерыгин" <[hidden email]>:

https://yadi.sk/d/eGBVz23MqdPc4 
Вот мои потуги. Готов выслушать все ваши замечания , предложения, гневные отзывы


Среда, 30 марта 2016, 20:48 +04:00 от Бомбин Валентин <[hidden email]>:

Чуть больше про like '%.%'
Как это работает - сервер БД не может на этом условии использовать никаких индексов. От слова вообще. like - это использование regexp'a, а regexp - это построение DFA и применение его к тексту. в общем - очень-очень-очень медленно. ОФИГЕННО медленно.
Как исправить?
1 путь - если можешь поменять структуру таблицы - добавь себе поле pointPosition с типом integer, в тригере onupdate/oninsert добавь расчет позиции этой точки который вернет целое число и положит в pointPosition это значение. Сделай индекс по этому полю.
твой запрос примет вид
" select id, pole1 from basa.main where pointPosition > 0' limit 0 , 10000000"
дальше - все как у тебя сейчас сделано.

2 путь - кривой, но для теста покатит -
" select id, pole1 from basa.main where MID(pole1,1,1) = '.' limit 0 , 10000000
union all
select id, pole1 from basa.main where MID(pole1,2,1) = '.' limit 0 , 10000000
union all
select id, pole1 from basa.main where MID(pole1,3,1) = '.' limit 0 , 10000000"
и т.д. - сколько там тебе длина нужна

Про обработку - опять же - не видя данных сказать что там делается - сложно, но как вариант - предложил бы создать в тригере oninsert|onupdate сделать запись в отдельную табличку куда класть уже обработанную строку. так что бы потом твой запрос свелся бы к простому селекту, без условий



--
С уважением, Бомбин Валентин
тел 79114208298


30.03.2016, 19:01, "витя ерыгин" <vitai96@...>:
> Сам запрос предельно прост
> S" select id, pole1 from basa.main where pole1 like '%.%' limit 0 , 10000000" Что здесь оптимизировать?
> Относительно вывод в файл. Обнаружил такую хрень
> Если файл с таким именем уже создан то результат -1 28 , к примеру, если нет, то 28 0. От результата параметры меняются местами, весело однако.
> "Как происходит обработка данных в плане выделения-освобождения памяти?" Да никак, хип не использую Создал себе массив на 5000 байтов туда и складирую строки, и уже обработанный результат на вывод. Обработка строк такова: вставить слева кавычку, вставить саму строку, следом за ней кавычку и точку. Нужно для корректности результатов, ибо что точки, что кавычек может не быть Ищем через SEARCH точку, а потом кавычку,  и уже от неё ищем кавычку снизу. Со стороны много лишних телодвижений, но, блин, корректность результатов. Подстановка слева строки-константы для поиска по FILE-EXISTS, вместо верхней кавычки ставим 0. Найден путь? Хрен с ним, не найден запись в файл. Вот так вот в общих чертах. Код на работе, завтра принесу.
>
> "написать критичный участок на другом языке (например, на Си)"
> ???
> Си хороший язык, быстрый. А за счёт чего интересно? Манипуляций со стеком там меньше. Грубо говоря pick и всеобщий drop. Грубо говоря. Это только мои предположения, что там ещё для меня полный х.з.
>
>> Среда, 30 марта 2016, 2:29 +04:00 от Ruvim Pinka <ruvim.pinka@...>:
>>
>> 2016-03-29 20:04 GMT+03:00 витя ерыгин <vitai96@...>:
>>> Передавать в пределах слова...
>>> Действительно, как то двусмысленно.
>>> Для слова, к примеру, надо три параметра. Чтобы не манипулировать ими на стеке, легче и быстрее их куда-нибудь раскидать. Хоть стек возвратов, как пример. Вот и возникла мысль попытаться засунуть переменную в регистр, и уже потом, когда возникнет необходимость положить переменную обратно на стек. Надеюсь, так быстрее будет работать?
>>
>> Если кажется, что будет быстрей — надо просто взять и проверить измерением.
>>
>> Но во первых, лучше бы запусить под профилировщикок на небольшой выборке данных, чтобы понять, какие места кушают больше всего времени. Могу предложить мой старенький велосипед: ~pinka/lib/tools/profiler.f
>>
>>> У меня задача обработка запроса от mysql. Запрос выдаёт десять миллионов строк, потом их обработка и вывод в файл. Запрос длится чуть меньше часа, обработка длится 45 мин, а потом заново. Чем быстрее проходит обработка, тем быстрее выполнится поставленная задача.
>>
>> Это вопрос выгоды и рентабельности: выбор делается между разработкой (суммарным временем человека-программиста) и выполнением (суммарное время машины), помноженной на экономический эффект.
>>
>> Поэтому, следует понимать, сколько своего времени вы можете потратить на экономию каждой минуты машинного времени в этой задаче. И, может быть оправдано оптимизировать не только решение на стороне Форта, но и решение на стороне базы данных и SQL. Т.к. иначе, даже если обработка будет длиться 0 минут, 55 минут на запрос все-равно останется, и значит оптимизация в 45% — это теоретический предел.
>>
>>> 1)  Оптимизировать алгоритм. - всё  просто, оптимизировать некуда
>>
>> Как вывод в файл происходит? Это же вызов функций Win32 API, на которых следует экономить — буферизировать вывод.
>> Как происходит обработка данных в плане выделения-освобождения памяти? Эти функции тоже лучше дергать по-реже.
>> Обработка строк, например поиск подстроки — используются ли быстрые алгоритмы поиска?
>> И, как верно заметил Валентин насчет параллельной обработки — разве все ядра проца уже задействованы? ;)
>>
>>> 2) Написать критичный участок на ассемблере. - плохо знаю ассемблер. Только к нему приступил
>>
>> Использовать регистры без базовых знаний никак.
>> Но, есть еще похожий вариант: написать критичный участок на другом языке (например, на Си) и использовать через DLL.
>>
>>> 3) Использовать другой форт-транслятор (например, с более мощным оптимизатором). - Какой, если не секрет?
>>
>> Некоторые коммерческие форт-системы обладают хорошим оптимизатором — например SwiftForth, VFX Forth. Но, еще не известно, будут ли они быстрей — надо проверять и сравнивать на конкретной задаче.
>>
>>> 4) Апгрейдить железо. - Это не вариант, к несчастью.
>>
>> --
>> Ruvim
>>
>> ------------------------------------------------------------------------------
>> Transform Data into Opportunity.
>> Accelerate data analysis in your applications with
>> Intel Data Analytics Acceleration Library.
>> Click to learn more.
>> http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
>>
>> _______________________________________________
>> Spf-dev mailing list
>> Spf-dev@...
>> https://lists.sourceforge.net/lists/listinfo/spf-dev
>
> ,
>
> ------------------------------------------------------------------------------
> Transform Data into Opportunity.
> Accelerate data analysis in your applications with
> Intel Data Analytics Acceleration Library.
> Click to learn more.
> http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
> ,
>
> _______________________________________________
> Spf-dev mailing list
> Spf-dev@...
> https://lists.sourceforge.net/lists/listinfo/spf-dev

,

------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140

,

_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev


------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Как ускорить программу на форте?

Ruvim Pinka

2016-04-01 20:41 GMT+03:00 Королев Виктор <[hidden email]>:
Да и работа со строками намного удобнее, используя STR5.f , чем  V-MOVE и далее в mysql-RAB.f

str5.f не подходит, если важно быстродействие, т.к. при развертывании (интерполировании) делается:
1. поиск по словарю,
2. RESIZE (хоть и быстрый, но все-таки внешний вызов).

А реализованный "символьный стек" V-MOVE — это аналог пространства данных dictionary:
: V-MOVE ( a1 u -- a2 u ) HERE OVER 2SWAP S, ;
: >V-S ( c -- ) C, ;

И служит как буфер для сбора кусков.

А вот слово ":+MEM" — весьма корявое решение.

--
Ruvim


------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Как ускорить программу на форте?

Королев Виктор
 
Все же, риторический вопрос, при нынешних реалиях, стоит ли бороться в скорости за миллисекунды в ускорении программ на форте, имею виду исполнение форт слов.. не сравнимые с внешними COM OLE  SQL...
 
01.04.2016, 22:41, "Ruvim Pinka" <[hidden email]>:

2016-04-01 20:41 GMT+03:00 Королев Виктор <[hidden email]>:
Да и работа со строками намного удобнее, используя STR5.f , чем  V-MOVE и далее в mysql-RAB.f
 
str5.f не подходит, если важно быстродействие, т.к. при развертывании (интерполировании) делается:
1. поиск по словарю,
2. RESIZE (хоть и быстрый, но все-таки внешний вызов).

А реализованный "символьный стек" V-MOVE — это аналог пространства данных dictionary:
: V-MOVE ( a1 u -- a2 u ) HERE OVER 2SWAP S, ;
: >V-S ( c -- ) C, ;

И служит как буфер для сбора кусков.

А вот слово ":+MEM" — весьма корявое решение.

--
Ruvim

,

------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140

,

_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev


------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Как ускорить программу на форте?

Ruvim Pinka

2016-04-01 22:54 GMT+03:00 Королев Виктор <[hidden email]>:
 
Все же, риторический вопрос, при нынешних реалиях, стоит ли бороться в скорости за миллисекунды в ускорении программ на форте, имею виду исполнение форт слов.. не сравнимые с внешними COM OLE  SQL...

Не смотря на очевидный ответ "не стоит", вполне могут быть случаи, когда это дает вполне ощутимую выгоду.

Например, если SQL запрос занимает 1/1000 от остальной обработки, а пару миллисекунд экономяться в слове, которое вызывается 10^5 раз.

--
Ruvim


------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|

Re: Как ускорить программу на форте?

витя ерыгин
In reply to this post by Ruvim Pinka
Насчёт :+mem согласен полностью, но в ассемблерном коде укладывается в несколько команд


Пятница, 1 апреля 2016, 23:41 +04:00 от Ruvim Pinka <[hidden email]>:


2016-04-01 20:41 GMT+03:00 Королев Виктор <vict-korolev@...>:
Да и работа со строками намного удобнее, используя STR5.f , чем  V-MOVE и далее в mysql-RAB.f

str5.f не подходит, если важно быстродействие, т.к. при развертывании (интерполировании) делается:
1. поиск по словарю,
2. RESIZE (хоть и быстрый, но все-таки внешний вызов).

А реализованный "символьный стек" V-MOVE — это аналог пространства данных dictionary:
: V-MOVE ( a1 u -- a2 u ) HERE OVER 2SWAP S, ;
: >V-S ( c -- ) C, ;

И служит как буфер для сбора кусков.

А вот слово ":+MEM" — весьма корявое решение.

--
Ruvim

------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
Spf-dev@...
https://lists.sourceforge.net/lists/listinfo/spf-dev


------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785471&iu=/4140
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
12