123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- ;;; coding: latin1 -*- mode: scheme; coding: latin-1; -*-
- ;;; srfi-13.bm
- ;;;
- ;;; Copyright (C) 2009 Free Software Foundation, Inc.
- ;;;
- ;;;
- ;;; This program is free software; you can redistribute it and/or
- ;;; modify it under the terms of the GNU Lesser General Public License
- ;;; as published by the Free Software Foundation; either version 3, or
- ;;; (at your option) any later version.
- ;;;
- ;;; This program is distributed in the hope that it will be useful,
- ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
- ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ;;; GNU Lesser General Public License for more details.
- ;;;
- ;;; You should have received a copy of the GNU Lesser General Public
- ;;; License along with this software; see the file COPYING.LESSER. If
- ;;; not, write to the Free Software Foundation, Inc., 51 Franklin
- ;;; Street, Fifth Floor, Boston, MA 02110-1301 USA
- (define-module (benchmarks strings)
- :use-module (benchmark-suite lib))
- (seed->random-state 1)
- (define short-string "Hi")
- (define medium-string
- "ARMA virumque cano, Troiae qui primus ab oris
- Italiam, fato profugus, Laviniaque venit")
- (define long-string
- (string-tabulate
- (lambda (n) (integer->char (+ 32 (random 90))))
- 1000))
- (define short-chlist (string->list short-string))
- (define medium-chlist (string->list medium-string))
- (define long-chlist (string->list long-string))
- (define str1 (string-copy short-string))
- (define str2 (string-copy medium-string))
- (define str3 (string-copy long-string))
- (with-benchmark-prefix "strings"
- (with-benchmark-prefix "predicates"
- (benchmark "string?" 1190000
- (string? short-string)
- (string? medium-string)
- (string? long-string))
- (benchmark "null?" 969000
- (string-null? short-string)
- (string-null? medium-string)
- (string-null? long-string))
-
- (benchmark "any" 94000
- (string-any #\a short-string)
- (string-any #\a medium-string)
- (string-any #\a long-string))
- (benchmark "every" 94000
- (string-every #\a short-string)
- (string-every #\a medium-string)
- (string-every #\a long-string)))
- (with-benchmark-prefix "constructors"
- (benchmark "string" 5000
- (apply string short-chlist)
- (apply string medium-chlist)
- (apply string long-chlist))
- (benchmark "list->" 4500
- (list->string short-chlist)
- (list->string medium-chlist)
- (list->string long-chlist))
- (benchmark "reverse-list->" 5000
- (reverse-list->string short-chlist)
- (reverse-list->string medium-chlist)
- (reverse-list->string long-chlist))
- (benchmark "make" 22000
- (make-string 250 #\x))
- (benchmark "tabulate" 17000
- (string-tabulate integer->char 250))
- (benchmark "join" 5500
- (string-join (list short-string medium-string long-string) "|" 'suffix)))
- (with-benchmark-prefix "list/string"
- (benchmark "->list" 7300
- (string->list short-string)
- (string->list medium-string)
- (string->list long-string))
- (benchmark "split" 60000
- (string-split short-string #\a)
- (string-split medium-string #\a)
- (string-split long-string #\a)))
- (with-benchmark-prefix "selection"
- (benchmark "ref" 660
- (let loop ((k 0))
- (if (< k (string-length short-string))
- (begin
- (string-ref short-string k)
- (loop (+ k 1)))))
- (let loop ((k 0))
- (if (< k (string-length medium-string))
- (begin
- (string-ref medium-string k)
- (loop (+ k 1)))))
- (let loop ((k 0))
- (if (< k (string-length long-string))
- (begin
- (string-ref long-string k)
- (loop (+ k 1))))))
- (benchmark "copy" 20000
- (string-copy short-string)
- (string-copy medium-string)
- (string-copy long-string)
- (substring/copy short-string 0 1)
- (substring/copy medium-string 10 20)
- (substring/copy long-string 100 200))
- (benchmark "pad" 34000
- (string-pad short-string 100)
- (string-pad medium-string 100)
- (string-pad long-string 100))
- (benchmark "trim trim-right trim-both" 60000
- (string-trim short-string char-alphabetic?)
- (string-trim medium-string char-alphabetic?)
- (string-trim long-string char-alphabetic?)
- (string-trim-right short-string char-alphabetic?)
- (string-trim-right medium-string char-alphabetic?)
- (string-trim-right long-string char-alphabetic?)
- (string-trim-both short-string char-alphabetic?)
- (string-trim-both medium-string char-alphabetic?)
- (string-trim-both long-string char-alphabetic?)))
- (with-benchmark-prefix "modification"
- (set! str1 (string-copy short-string))
- (set! str2 (string-copy medium-string))
- (set! str3 (string-copy long-string))
- (benchmark "set!" 3000
- (let loop ((k 1))
- (if (< k (string-length short-string))
- (begin
- (string-set! str1 k #\x)
- (loop (+ k 1)))))
- (let loop ((k 20))
- (if (< k (string-length medium-string))
- (begin
- (string-set! str2 k #\x)
- (loop (+ k 1)))))
- (let loop ((k 900))
- (if (< k (string-length long-string))
- (begin
- (string-set! str3 k #\x)
- (loop (+ k 1))))))
- (set! str1 (string-copy short-string))
- (set! str2 (string-copy medium-string))
- (set! str3 (string-copy long-string))
- (benchmark "sub-move!" 230000
- (substring-move! short-string 0 2 str2 10)
- (substring-move! medium-string 10 20 str3 20))
- (set! str1 (string-copy short-string))
- (set! str2 (string-copy medium-string))
- (set! str3 (string-copy long-string))
- (benchmark "fill!" 230000
- (string-fill! str1 #\y 0 1)
- (string-fill! str2 #\y 10 20)
- (string-fill! str3 #\y 20 30))
- (with-benchmark-prefix "comparison"
- (benchmark "compare compare-ci" 140000
- (string-compare short-string medium-string string<? string=? string>?)
- (string-compare long-string medium-string string<? string=? string>?)
- (string-compare-ci short-string medium-string string<? string=? string>?)
- (string-compare-ci long-string medium-string string<? string=? string>?))
-
- (benchmark "hash hash-ci" 1000
- (string-hash short-string)
- (string-hash medium-string)
- (string-hash long-string)
- (string-hash-ci short-string)
- (string-hash-ci medium-string)
- (string-hash-ci long-string))))
-
- (with-benchmark-prefix "searching" 20000
- (benchmark "prefix-length suffix-length" 270
- (string-prefix-length short-string
- (string-append short-string medium-string))
- (string-prefix-length long-string
- (string-append long-string medium-string))
- (string-suffix-length short-string
- (string-append medium-string short-string))
- (string-suffix-length long-string
- (string-append medium-string long-string))
- (string-prefix-length-ci short-string
- (string-append short-string medium-string))
- (string-prefix-length-ci long-string
- (string-append long-string medium-string))
- (string-suffix-length-ci short-string
- (string-append medium-string short-string))
- (string-suffix-length-ci long-string
- (string-append medium-string long-string)))
- (benchmark "prefix? suffix?" 270
- (string-prefix? short-string
- (string-append short-string medium-string))
- (string-prefix? long-string
- (string-append long-string medium-string))
- (string-suffix? short-string
- (string-append medium-string short-string))
- (string-suffix? long-string
- (string-append medium-string long-string))
- (string-prefix-ci? short-string
- (string-append short-string medium-string))
- (string-prefix-ci? long-string
- (string-append long-string medium-string))
- (string-suffix-ci? short-string
- (string-append medium-string short-string))
- (string-suffix-ci? long-string
- (string-append medium-string long-string)))
- (benchmark "index index-right rindex" 100000
- (string-index short-string #\T)
- (string-index medium-string #\T)
- (string-index long-string #\T)
- (string-index-right short-string #\T)
- (string-index-right medium-string #\T)
- (string-index-right long-string #\T)
- (string-rindex short-string #\T)
- (string-rindex medium-string #\T)
- (string-rindex long-string #\T))
- (benchmark "skip skip-right?" 100000
- (string-skip short-string char-alphabetic?)
- (string-skip medium-string char-alphabetic?)
- (string-skip long-string char-alphabetic?)
- (string-skip-right short-string char-alphabetic?)
- (string-skip-right medium-string char-alphabetic?)
- (string-skip-right long-string char-alphabetic?))
- (benchmark "count" 10000
- (string-count short-string char-alphabetic?)
- (string-count medium-string char-alphabetic?)
- (string-count long-string char-alphabetic?))
-
- (benchmark "contains contains-ci" 34000
- (string-contains short-string short-string)
- (string-contains medium-string (substring medium-string 10 15))
- (string-contains long-string (substring long-string 100 130))
- (string-contains-ci short-string short-string)
- (string-contains-ci medium-string (substring medium-string 10 15))
- (string-contains-ci long-string (substring long-string 100 130)))
- (set! str1 (string-copy short-string))
- (set! str2 (string-copy medium-string))
- (set! str3 (string-copy long-string))
- (benchmark "upcase downcase upcase! downcase!" 600
- (string-upcase short-string)
- (string-upcase medium-string)
- (string-upcase long-string)
- (string-downcase short-string)
- (string-downcase medium-string)
- (string-downcase long-string)
- (string-upcase! str1 0 1)
- (string-upcase! str2 10 20)
- (string-upcase! str3 100 130)
- (string-downcase! str1 0 1)
- (string-downcase! str2 10 20)
- (string-downcase! str3 100 130)))
- (with-benchmark-prefix "readers"
- (benchmark "read token, method 1" 1200
- (let ((buf (make-string 512)))
- (let loop ((i 0))
- (if (< i 512)
- (begin
- (string-set! buf i #\x)
- (loop (+ i 1)))
- buf))))
- (benchmark "read token, method 2" 1200
- (let ((lst '()))
- (let loop ((i 0))
- (set! lst (append! lst (list #\x)))
- (if (< i 512)
- (loop (+ i 1))
- (list->string lst)))))))
|