10.08.2007, 11:22 | #21 |
Участник
|
Чистый не умел, но это и не важно. Важно то, что функциональное программирование отличает не то, как хранятся данные, а то, как происходят вычисления.
|
|
10.08.2007, 11:24 | #22 |
Moderator
|
http://www.gprolog.org/
Цитата:
# MySQL/Prolog - an interface to MySQL database
# ODBC/Prolog - a small ODBC interface module for gprolog |
|
10.08.2007, 11:26 | #23 |
Участник
|
я бы попробовал еще этот способ
|
|
10.08.2007, 11:30 | #24 |
Moderator
|
Цитата:
я бы попробовал еще этот способ
|
|
10.08.2007, 11:39 | #25 |
Участник
|
Ага. Мне кажется, эти мепы и редюсы внутри x++ не стоит того.
А вот написать что-нибудь интеллектуальное на Haskell (всякие там трасформации исходников, например), а потом поиспользовать... |
|
10.08.2007, 11:41 | #26 |
Moderator
|
Цитата:
А вот написать что-нибудь интеллектуальное на Haskell (всякие там трасформации исходников, например), а потом поиспользовать...
|
|
10.08.2007, 11:42 | #27 |
Участник
|
Цитата:
А работа с цепочками записей (db_chains) в чем-то сходна с работой в СУБД ADABAS. |
|
10.08.2007, 11:47 | #28 |
Участник
|
|
|
10.08.2007, 11:51 | #29 |
Moderator
|
Цитата:
Ну, я планирую для инструментальных вещей поиспользовать (хочется встоить простенький sql profiler)
p.s. И мне еще говорят "что у меня много свободного времени"...... |
|
10.08.2007, 12:10 | #30 |
Участник
|
Знакомый делает для BAAN. Я немного перетачиваю под MS SQL - но там еще долгий путь.
|
|
10.08.2007, 12:20 | #31 |
Участник
|
Цитата:
в нем и типы были. |
|
10.08.2007, 12:54 | #32 |
Гость
|
это не наш пролог. В нем рыбу заворачивали
|
|
10.08.2007, 15:11 | #33 |
Участник
|
кстати, py3к dct бутед работать с итераторами а не списками, может и тут так сделать?
типа X++: select EmplTable; xml = '<records>' + join(map(new CursorEnumerator(EmplTable), 'x.xml()')) + '</records>'; |
|
11.08.2007, 19:34 | #34 |
Участник
|
На досуге (сижу в субботу на работе) решил добить до конца тестирование скорости выполнения различных операций вставки значений в контейнер.
Вот Job, с помощью которого замерялась скорость выполнения. X++: #define.LoopCount(50000) #LocalMacro.Start timeBefore = WinApi::getTickCount(); #EndMacro #LocalMacro.Reset timeAfter = WinApi::getTickCount(); info(num2str((timeAfter - timeBefore) /1000, 0, 4, 2, 0)); con = conNull(); len = 1; #EndMacro static void tutorial_SpeedTestContainerOperations(Args _args) { container con; int i; int len = 1; int timeBefore; int timeAfter; ; #Start for (i = 1; i < #LoopCount; i++) con += i; #Reset #Start for (i = 1; i < #LoopCount; i++) con = con + i; #Reset #Start for (i = 1; i < #LoopCount; i++) con = conIns(con, conLen(con)+1, i); #Reset #Start for (i = 1; i < #LoopCount; i++) { con = conIns(con, len, i); len++; } #Reset #Start for (i = 1; i < #LoopCount; i++) con = conPoke(con, conLen(con)+1, i); #Reset #Start for (i = 1; i < #LoopCount; i++) { con = conPoke(con, len, i); len++; } #Reset } Сейчас код уже подправил. Спасибо glibs за наводку и продолжение тестирования. Итак, как видно из обновленных результатов - предложенный мной выше вариант намного лучше всех остальных. Исходя также из результатов, полученных glibs, использования Foundation Classes дает очень неплохие результаты. Вот результаты, которые я получил на своей системе: Последний раз редактировалось kashperuk; 12.08.2007 в 16:51. Причина: ошибочка, блин :) |
|
|
За это сообщение автора поблагодарили: mazzy (5). |
12.08.2007, 11:45 | #35 |
Member
|
В 4.0 выбрасывает трассировку стека в начале третьего цикла при попытке вставить в контейнер элемент на нулевую позицию.
3.0 на эту ошибку не реагирует. Что-то полезное таки делают. Приятно. Жаль, что мало.
__________________
С уважением, glibs® |
|
12.08.2007, 11:55 | #36 |
Member
|
Слегка подправил код.
Info Сообщение (11:48:54) 0,3440 Info Сообщение (11:48:54) 9,8120 Info Сообщение (11:48:54) 10,0160 Info Сообщение (11:48:54) 9,9220 Info Сообщение (11:48:54) 10,1560 Info Сообщение (11:48:54) 10,0150 Это 4.0 Info Сообщение (11:50:12) 0,1880 Info Сообщение (11:50:12) 14,1090 Info Сообщение (11:50:12) 14,1100 Info Сообщение (11:50:12) 14,1720 Info Сообщение (11:50:12) 14,3590 Info Сообщение (11:50:12) 14,2500 А это 3.0 Ух ты... в 4.0 перед копированием русского текста мне не пришлось переключаться на русский. Интересно, это у всех так (а то у меня 2003-й английский Windows просто)?
__________________
С уважением, glibs® |
|
12.08.2007, 12:13 | #37 |
Member
|
Попробовал List.
Вставка в 3.0 в конец 0,1880 В 4.0 Info Сообщение (12:08:24) 0,3280 А что за задача? Ставить нужно в конец или куда ни попади (надеюсь, вы не с ветряными мельницами боролись)?
__________________
С уважением, glibs® |
|
12.08.2007, 13:00 | #38 |
Участник
|
Цитата:
Сообщение от glibs
Слегка подправил код.
Info Сообщение (11:48:54) 0,3440 Info Сообщение (11:48:54) 9,8120 Info Сообщение (11:48:54) 10,0160 Info Сообщение (11:48:54) 9,9220 Info Сообщение (11:48:54) 10,1560 Info Сообщение (11:48:54) 10,0150 Это 4.0 Info Сообщение (11:50:12) 0,1880 Info Сообщение (11:50:12) 14,1090 Info Сообщение (11:50:12) 14,1100 Info Сообщение (11:50:12) 14,1720 Info Сообщение (11:50:12) 14,3590 Info Сообщение (11:50:12) 14,2500 А это 3.0 Ух ты... в 4.0 перед копированием русского текста мне не пришлось переключаться на русский. Интересно, это у всех так (а то у меня 2003-й английский Windows просто)? Копируется верно, потому что используется UniCode насколько я понимаю. А задачи конкретной нет, это так, для общего развития себя и других |
|
12.08.2007, 13:04 | #39 |
Участник
|
Цитата:
Метод add, который я ему посоветовал подоптимизировать, не проверив прежде, действительно ли это оптимизация. |
|
12.08.2007, 13:19 | #40 |
Member
|
Последняя версия вот. Остальные я уже стер. Цифры по List я приводил, пока там еще был тип Integer.
#define.LoopCount(50000) #LocalMacro.Start timeBefore = WinApi::getTickCount(); #EndMacro #LocalMacro.Reset timeAfter = WinApi::getTickCount(); info(num2str((timeAfter - timeBefore) /1000, 0, 4, 2, 0)); con = conNull(); len = 1; #EndMacro static void glibs() { List list = new List(Types::Container); ListIterator listIterator; container con; int i; int len = 1; int timeBefore; int timeAfter; ; #Start for (i = 1; i < #LoopCount; i++) list.addEnd([i]); #Reset /* #Start for (i = 1; i < #LoopCount; i++) con += i; #Reset #Start for (i = 1; i < #LoopCount; i++) con = con + i; #Reset #Start for (i = 1; i < #LoopCount; i++) con = conIns(con, conLen(con) + 1, i); #Reset #Start for (i = 1; i < #LoopCount; i++) { con = conIns(con, len, i); len++; } #Reset #Start for (i = 1; i < #LoopCount; i++) con = conPoke(con, conLen(con) + 1, i); #Reset #Start for (i = 1; i < #LoopCount; i++) { con = conPoke(con, len, i); len++; } #Reset */ }
__________________
С уважением, glibs® |
|
|
|