emacs 中快速统计log文件中某些变量的均值,方差,最大值,最小值。。。

工作中经常会通过输出log对程序各模块耗时进行统计,写了个命令快速统计log文件中某个模块耗时。

原理是通过occur查找要统计的量,然后选中列,通过emacs内置命令对数值进行统计。

mean

(require 'calc-stat)
(defun statistics-in-region (start end)
  (interactive "r")
  (setq LIST (split-string (buffer-substring start end)))
  (setq LIST (mapcar* #'(lambda (X) (math-read-number X)) LIST))
  (message "length:%s, mean:%s, variance:%s, standard deviation:%s, meidan:%s, max:%s, min:%s"
           (length LIST)
           (math-format-number (calcFunc-vmean (cons 'vec LIST)))
           (math-format-number (calcFunc-vvar (cons 'vec LIST)))
           (math-format-number (calcFunc-vsdev (cons 'vec LIST)))
           (math-format-number (calcFunc-vmedian (cons 'vec LIST)))
           (math-format-number (calcFunc-vmax (cons 'vec LIST)))
           (math-format-number (calcFunc-vmin (cons 'vec LIST)))))

(defun statistics-in-rectangle (start end)
  "statistics-in-rectangle."
  (interactive "r")
  (setq LIST nil)
  (dolist (element (extract-rectangle start end)) ;; extract-rectangle to lists
    (setq LIST (append LIST (split-string element)))) ;; apend to list
  ;; (setq LIST (seq-map 'string-to-number LIST)) ;;  convert to num
  (setq LIST (mapcar* #'(lambda (X) (math-read-number X)) LIST))
  (message "length:%s, mean:%s, variance:%s, standard deviation:%s, meidan:%s, max:%s, min:%s"
           (length LIST)
           (math-format-number (calcFunc-vmean (cons 'vec LIST)))
           (math-format-number (calcFunc-vvar (cons 'vec LIST)))
           (math-format-number (calcFunc-vsdev (cons 'vec LIST)))
           (math-format-number (calcFunc-vmedian (cons 'vec LIST)))
           (math-format-number (calcFunc-vmax (cons 'vec LIST)))
           (math-format-number (calcFunc-vmin (cons 'vec LIST)))))
3 个赞

看起来不错,如果log文件太大,几个G,这样统计性能怎么样,会不会卡

日支比较大的话,用emacs处理确实不是太得心应手,日志浏览我用 lnav (也有统计分析的功能);日志的统计分析可以了解一下 miller