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

(if (and (not vle-vector-crossproduct) (findfile "vle-extension.lsp")) (load "vle-extension.lsp"))

(defun emul-vector-crossproduct ( vec1 vec2 / vX1 vY1 vZ1 vX2 vY2 vZ2 )
  (if (or (/= (type vec1) 'LIST) (/= (type vec2) 'LIST)) (exit))

  (setq vX1 (car vec1) vY1 (cadr vec1))
  (setq vX2 (car vec2) vY2 (cadr vec2))
  (if (or (not vX1) (not vY1) (not vX2) (not vY2)) (exit))

  (setq vZ1 (caddr vec1) vZ2 (caddr vec2))
  (if (not vZ1) (setq vZ1 0.0))
  (if (not vZ2) (setq vZ2 0.0))

  (list (- (* vY1 vZ2) (* vZ1 vY2))
        (- (* vZ1 vX2) (* vX1 vZ2))
        (- (* vX1 vY2) (* vY1 vX2))
  )
)

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

  ;;--- build data list
  (setq v2d '(22.0 33.0) v3d '(22.0 33.0 44.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-crossproduct v2d v3d)
    (emul-vector-crossproduct v3d v2d)
  )

  (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-crossproduct v2d v3d)
    (vle-vector-crossproduct v3d v2d)
  )

  (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-CROSSPRODUCT : " (rtos bench$secsFast 2 3) "\n"))
  (if fptr
    (princ (strcat "* (Standard) : " (rtos bench$secsNorm 2 3) "  VLE-VECTOR-CROSSPRODUCT : " (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_crossproduct (* 300 $benchcyclesfactor) nil)
  (setvar "cmdecho" 1)
  (princ)
)
