Autolisp vs Java
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Autolisp vs Java

Autolisp vs Java

Ответ
Поиск в этой теме
Непрочитано 30.01.2009, 10:57 #1
Autolisp vs Java
Sleekka
 
-
 
Москва
Регистрация: 24.07.2005
Сообщений: 1,335

Значицца так - разговаривали мы вчера с одним программистом на Java про достоинства и недостатки этих языков.
Ну в конце концов решили написать тестовую задачку, создание в оперативке массива на 1000 000 000 элементов (идея была в том чтобы посмотреть что будет когда кончится память), но до этого дело слава богу не дошло на 1000 000 элементов мы разошлись миром.
Все было конечно и так понятно что лисп медленный но то что получилось в результате меня никак не устраивает:
Мой код такой:
Код:
[Выделить все]
(defun sl_mil_ (/ sl_list ent sl_db_file_)
  (setq sl_db_file_ (open "C:\\sl_mil_list.txt" "w"))
(setq sl_list (list))
       (setq ent 1)
       (while (< ent 1000000)
	 (setq sl_list (append sl_list (list ent)))
	 (setq ent (1+ ent))
)
  (princ sl_list)
  (foreach rettt sl_list
  (write-line (rtos rettt 2 4) sl_db_file_)
    )
  (close sl_db_file_)
       )



(sl_mil_)
В итоге ждали минуты 3-4 даже списка в оперативе не дождались, а там еще в файл надо записать, а Java-код сделал всю работу секунды! за 3.
Внимание вопрос? Что я такого плохого написал? как оптимизировать? и чего вообще с этим все делать?
Просмотров: 1659
 
Непрочитано 30.01.2009, 12:06
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Небольшая переделка (без файловых операций):
Код:
[Выделить все]
(defun sl_mil_ (range / sl_list ent sl_db_file_)
;;;  (setq sl_db_file_ (open "C:\\sl_mil_list.txt" "w"))
;;;  (setq sl_list (list))
  (setq ent 1)
  (while (< ent range)
    (setq sl_list (append sl_list (list ent)))
    (setq ent (1+ ent))
    ) ;_ end of while
  sl_list
;;;  (princ sl_list)
;;;  (foreach rettt sl_list
;;;    (write-line (rtos rettt 2 4) sl_db_file_)
;;;    ) ;_ end of foreach
;;;  (close sl_db_file_)
  ) ;_ end of defun

(defun test (range / count res)
  (setq count 0)
  (repeat range
    (setq res (cons (setq count (1+ count)) res))
    ) ;_ end of repeat
  (reverse res)
  ) ;_ end of defun
И потом проверка:
Код:
[Выделить все]
(BENCHMARK '((SL_MIL_ 100)(test 100)))
Benchmarking .............Elapsed milliseconds / relative speed for 1024 iteration(s):

    (TEST 100)........1000 / 4.94 <fastest>
    (SL_MIL_ 100).....4938 / 1 <slowest>
То есть получается что при длине списка в 100 элементов твой код почти в 5 раз медленнее. При увеличении длины списка разница растет неимоверными темпами (правда, скорость сравнения в ауте полном):
Код:
[Выделить все]
$ (BENCHMARK '((SL_MIL_ 1000)(test 1000)))
Benchmarking ...........Elapsed milliseconds / relative speed for 256 iteration(s):

    (TEST 1000).........1094 / 41.05 <fastest>
    (SL_MIL_ 1000).....44906 / 1 <slowest>

_$ (BENCHMARK '((SL_MIL_ 10000)(test 10000)))
Benchmarking ........Elapsed milliseconds / relative speed for 32 iteration(s):

    (TEST 10000)..........2594 / 190.81 <fastest>
    (SL_MIL_ 10000).....494954 / 1 <slowest>
Ну и так далее. Общие рекомендации:
1. append значительно медленнее cons'a
2. Сначала формируй список, и только потом открывай файл для вывода.
3. Избегай ненужных (princ) - они обычно не требуются и тормозят выполнение (хотя в некоторых случаях они незаменимы)
4. Подумай о том, чтобы выполнять преобразования сразу, а не последовательно.
5. Если у тебя нет кода benchmark'a лиспового, сообщи - выложу.
Дополнительно - еще несколько вариантов кода с проверкой (уже только на 100 элементов - времени нет):
Код:
[Выделить все]
(defun sl_mil_ (range / sl_list ent sl_db_file_)
;;;  (setq sl_db_file_ (open "C:\\sl_mil_list.txt" "w"))
;;;  (setq sl_list (list))
  (setq ent 1)
  (while (< ent range)
    (setq sl_list (append sl_list (list ent)))
    (setq ent (1+ ent))
    ) ;_ end of while
  sl_list
;;;  (princ sl_list)
;;;  (foreach rettt sl_list
;;;    (write-line (rtos rettt 2 4) sl_db_file_)
;;;    ) ;_ end of foreach
;;;  (close sl_db_file_)
  ) ;_ end of defun

(defun test0 (range / count res)
  (setq count 0)
  (repeat range
    (setq res (cons (setq count (1+ count)) res))
    ) ;_ end of repeat
  (reverse res)
  ) ;_ end of defun

(defun test1 (range / count res)
  (setq count 0)
  (repeat range
    (setq res (cons (vl-princ-to-string (setq count (1+ count))) res))
    ) ;_ end of repeat
  (reverse res)
  ) ;_ end of defun

(defun test2 (range / count res)
  (setq count 0)
  (repeat range
    (setq res (cons (setq count (1+ count)) res))
    ) ;_ end of repeat
  (mapcar (function vl-princ-to-string) (reverse res))
  ) ;_ end of defun

(defun test3 (range / count res)
  (setq count 0)
  (repeat range
    (setq res (cons (itoa (setq count (1+ count))) res))
    ) ;_ end of repeat
  (reverse res)
  ) ;_ end of defun

(defun test4 (range / count res)
  (setq count 0)
  (repeat range
    (setq res (cons (setq count (1+ count)) res))
    ) ;_ end of repeat
  (mapcar (function itoa) (reverse res))
  ) ;_ end of defun
Код:
[Выделить все]
_$ (BENCHMARK '((SL_MIL_ 100)(test0 100) (test1 100) (test2 100) (test3 100)(test4 100)))
Benchmarking ...............Elapsed milliseconds / relative speed for 4096 iteration(s):

    (TEST3 100).......2125 / 4.6 <fastest>
    (TEST0 100).......3875 / 2.52
    (TEST4 100).......4344 / 2.25
    (TEST1 100).......7531 / 1.3
    (TEST2 100).......7579 / 1.29
    (SL_MIL_ 100).....9766 / 1 <slowest>
Да, и вот еще. Попробуй скомпилировать код в fas - быстродействие должно по крайней мере не упасть.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 30.01.2009 в 12:09. Причина: Для последнего теста забыл про (test1)
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.01.2009, 12:35
#3
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


benchmark'а -нету, дайте пожалуйста
Sleekka вне форума  
 
Непрочитано 30.01.2009, 13:02
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Забирай Кстати, Евгений Елпанов его уже выкладывал
Вложения
Тип файла: lsp benchmark.lsp (7.1 Кб, 80 просмотров)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 30.01.2009, 14:20
#5
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


От спасибо, гуру, буду разбираться.
Sleekka вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Autolisp vs Java



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AutoLisp и база данных SQL-сервера Макс_Кунгур LISP 83 25.06.2019 12:00
Mirror в autolisp Odessit LISP 4 26.12.2012 17:08
Не понимаю почему не работает _Intersect (AutoLISP) silic LISP 3 09.12.2008 21:21
Создание 3D-модели зубчатого колеса в AutoLISP Иван Андреевич LISP 3 18.11.2008 19:39
Функции в AutoLISP Briz06 LISP 4 14.10.2006 13:25