43 个回复 | 最后更新于 4 天前
2018-10-26   #25

回复#24 @xaengceilbiths :

(time (test split))
    893 collections
    4.189783432s elapsed cpu time, including 0.034834708s collecting
    4.210550685s elapsed real time, including 0.053108208s collecting
    7520571520 bytes allocated, including 7519781968 bytes reclaimed

;;  ta6le 二核四线程

(time (test split-multithread))
    778 collections
    3.220641342s elapsed cpu time, including 0.024140018s collecting
    3.220952575s elapsed real time, including 0.025745540s collecting
    6560497920 bytes allocated, including 6565673264 bytes reclaimed


2018-10-26   #26

回复#22 @guenchi :

求测试数据

可能是环境和系统问题

2018-10-26   #27

回复#24 @xaengceilbiths :

你的多线程版本在我的机器(intel i7 8700k)上效率并不理想。

2018-10-26   #28

回复#27 @fold :

你(machine-type)输出是啥

2018-10-26   #29

回复#28 @xaengceilbiths :

ta6nt

2018-10-26   #30

(define (split8 s c)
  (define len (string-length s))
  (define-syntax split-from-expansion
    (lambda (stx)
      (syntax-case stx ()
        [(_ () from-loc) #'(split-from from-loc)]
        [(_ (t r ...) from-loc)
         #`(let loop ([end-loc from-loc])
             (cond
               [(fx>= end-loc len) (if (fx= from-loc end-loc)
                                       '()
                                       (list (substring s from-loc end-loc)))]
               [(char=? c (string-ref s end-loc))
                (let ([next (fx1+ end-loc)])
                  (if (fx= from-loc end-loc)
                      (split-from-expansion (r ...) next)
                      (cons (substring s from-loc end-loc)
                            (split-from-expansion (r ...) next))))]
               [else (loop (fx1+ end-loc))]))])))
 
  (define (split-from from-loc)
    (let loop ([end-loc from-loc])
      (cond
        [(fx>= end-loc len) (if (fx= from-loc end-loc)
                                '()
                                (list (substring s from-loc end-loc)))]
        [(char=? c (string-ref s end-loc))
         (if (fx= from-loc end-loc)
             (split-from (fx1+ end-loc))
             (cons (substring s from-loc end-loc)
                   (split-from (fx1+ end-loc))))]
        [else (loop (fx1+ end-loc))])))
 
  (split-from-expansion (e e e e e) 0))


比split6还要快5%。



2018-10-26   #31

回复#30 @fold :

你这个太复杂了吧


不过比6慢那么一丢丢


2018-10-26   #32

回复#27 @fold :

我的也不太理想   


ta6osx


2018-10-26   #33

回复#26 @xaengceilbiths :

(define token "var i = 89 var j = 100 function f ( x y ) { return x + y } f ( i j )var i = 89 var j = 100 function f ( x y ) { return x + y } f ( i j )var i = 89 var j = 100 function f ( x y ) { return x + y } f ( i j )var i = 89 var j = 100 function f ( x y ) { return x + y } f ( i j )var i = 89 var j = 100 function f ( x y ) { return x + y } f ( i j )var i = 89 var j = 100 function f ( x y ) { return x + y } f ( i j )var i = 89 var j = 100 function f ( x y ) { return x + y } f ( i j )var i = 89 var j = 100 function f ( x y ) { return x + y } f ( i j )var i = 89 var j = 100 function f ( x y ) { return x + y } f ( i j )var i = 89 var j = 100 function f ( x y ) { return x + y } f ( i j )var i = 89 var j = 100 function f ( x y ) { return x + y } f ( i j )var i = 89 var j = 100 function f ( x y ) { return x + y } f ( i j )")


(define loop
(lambda (f s c t)
(let l ((x 0))
(f s c)
(if (< x t)
(l (+ x 1))))))

(time (loop split token #\space 10000))


2018-10-26   #34

回复#33 @guenchi :

这个测试下我的代码确实慢

2018-10-27   #35

回复#34 @xaengceilbiths :

我试过很多测试用例 这个是最能拉开区别的

2018-11-01   #36

回复#20 @qzivli :

检测出一个bug


当split的符号连续的时候 会出现非期待的空string “”

2018-11-01   #37

回复#36 @guenchi :


(string-split "foo::bar" #\:)


--> ("foo" "" "bar")


指的是这个空字符串吗?

2018-11-01   #38

回复#37 @qzivli :


2018-11-02   #39

回复#38 @guenchi :

这应该不是一个bug,"foo:bar" 和 "foo::bar" 切分后的结果应该是不一样的。


以下的结果还是"foo::bar"才对

(string-join (string-split "foo::bar" #\:) #\:)


我看了一下,Python和OCaml的标准库里面也是这样做的。

2018-11-02   #40

回复#39 @qzivli :

那能写一个无视重复切分字符的吗?

2018-11-03   #41

回复#40 @guenchi :

;; > (string-split "foo::bar" #\:)
;; ("foo" "" "bar")
;;
;; > (string-split/drop-null "foo::bar" #\:)
;; ("foo" "bar")

(define (string-split/drop-null str sep)
  (define (cons/drop a b)
    ;; should use string=?, but eq? is correct on a optimized compiler
    (if (eq? a "") b (cons a b)))
  (let f ([res '()]
          [j (string-length str)]
          [i (sub1 (string-length str))])
    (if (= i -1)
        (cons/drop (substring str 0 j) res)
        (if (char=? (string-ref str i) sep)
            (f (cons/drop (substring str (add1 i) j) res)
               i  ; jump to i
               (- i 1))
            (f res j (- i 1))))))


2018-11-20   #42

特地前来留言说明一下,鉴于我的实际问题,我其实最后用了`(srfi :115 regexp)`的库解决了问题,我本来的问题其实是要做筛选的类似`(regexp-matches? template-regex f)`。


然而感谢大家,讨论的好激烈!虽然感觉有点只是我问题的副作用。

4 天前   #43

https://srfi.schemers.org/srfi-152/srfi-152.html#string-split


https://github.com/arcfide/chez-srfi/tree/master/%253a152

登录后方可回帖

登 录
信息栏

Scheme中文社区

推荐实现 ChezScheme / r6rs / r7rs large
theschemer.org
Q群: 724577239

精华导览

社区项目

包管理器:Raven
HTTP服务器:Igropyr (希腊火)
官方插件:vscode-chez

社区目标:

完善足以使Scheme工程化和商业化的库,特别是开发极致速度的Web服务器和ANN模块。

一直以来Scheme缺少一个活跃的中文社区,同时中文资料的稀少,导致大多数因为黑客与画家和SICP而接触Scheme的朋友,在学完SICP后无事可做,不能将Scheme转换为实际的生产力。最后渐渐的放弃。
同时Chicken等实现,却因效率问题无法与其他语言竞争。本社区只有一个目的,传播Scheme的文明之火,在最快的编译器实现上,集众人之力发展出足够与其他语言竞争的社区和库。


友情链接:

Clojure 中文论坛
函数式·China


Loading...