(setq hasMilliSecs (/= (getvar "MILLISECS") nil))
(setvar "LOGFILEMODE" 0)
(vl-load-com)

(if (and (not vle-vector-isunitlength) (findfile "vle-extension.lsp")) (load "vle-extension.lsp"))
(if (not vle_g_vecTol) (setq vle_g_vecTol 0.0000000001))

(defun emul-vector-isunitlength ( vec / vX vY vZ )
  (if (/= (type vec) 'LIST) (exit))

  (setq vX (car vec) vY (cadr vec))
  (if (or (not vX) (not vY)) (exit))

  (setq vZ (caddr vec))
  (if (not vZ) (setq vZ 0.0))

  (equal (distance '(0 0 0) (list vX vY vZ)) 1.0 vle_g_vecTol)
)

(defun t_vle_vector_isunitlength ( count fptr / v2d v3d time1 time2 time3 time4 )

  ;;--- build data list
  (setq v2d '(22.0 33.0) v3d '(0 1 0))

  ;;--- now run test : NORMAL
  (setq time1 (getvar "MILLISECS"))
  (if (not time1) (setq time1 (getvar "TDUSRTIMER")))
  (if (not time1) (setq time1 0.0))

  (repeat (* count count)
    (emul-vector-isunitlength v2d)
    (emul-vector-isunitlength v3d)
  )

  (setq time2 (getvar "MILLISECS"))
  (if (not time2) (setq time2 (getvar "TDUSRTIMER")))
  (if (not time2) (setq time2 0.0))

  ;;--- now run test : VLE
  (setq time3 (getvar "MILLISECS"))
  (if (not time3) (setq time3 (getvar "TDUSRTIMER")))
  (if (not time3) (setq time3 0.0))

  (repeat (* count count)
    (vle-vector-isunitlength v2d)
    (vle-vector-isunitlength v3d)
  )

  (setq time4 (getvar "MILLISECS"))
  (if (not time4) (setq time4 (getvar "TDUSRTIMER")))
  (if (not time4) (setq time4 0.0))

  ;;--- test results
  (setq bench$secsNorm (if hasMilliSecs (* 0.001 (- time2 time1)) (* 86400.0 (- time2 time1))))
  (setq bench$secsFast (if hasMilliSecs (* 0.001 (- time4 time3)) (* 86400.0 (- time4 time3))))
  (setq bench$seconds (+ bench$secsNorm bench$secsFast))

  (princ (strcat "* (Standard) : " (rtos bench$secsNorm 2 3) "  VLE-VECTOR-ISUNITLENGTH : " (rtos bench$secsFast 2 3) "\n"))
  (if fptr
    (princ (strcat "* (Standard) : " (rtos bench$secsNorm 2 3) "  VLE-VECTOR-ISUNITLENGTH : " (rtos bench$secsFast 2 3) "\n") fptr)
  )

  bench$seconds
)

;; to increase/decrease the number of bench loops : > 1 increase < 1 decrease
(if (not $benchcyclesfactor) (setq $benchcyclesfactor 1))

;; to run this loaded test manually
(defun C:Run ()
  (setvar "cmdecho" 0)
  (print)
  (t_vle_vector_isunitlength (* 400 $benchcyclesfactor) nil)
  (setvar "cmdecho" 1)
  (princ)
)
