strcat比string慢

本文通过实验对比了使用 C++ 标准库 string 类与 strcat 函数进行字符串拼接的性能差异。实验结果显示,在大量重复拼接操作中,string 类的表现显著优于 strcat 函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我想比较下string比strcat慢多少,因为一个动态分配内存一个是静态分配。

结果大跌眼镜string比strcat还要快而且快的不是一个量级。

 

strcat:94
string:0

(defun c:SCG (/ *error* cmde os ss input color-value found layer-colors) ;; 错误处理函数 (defun *error* (msg) (if os (setvar 'osmode os)) (setvar 'cmdecho cmde) (princ (strcat "\n错误: " msg)) (princ) ) ;; 增强型颜色解析函数 (defun parse-color (str / parts r g b) (cond ;; 处理RGB格式 (支持带空格的输入) ((vl-string-search "," str) (setq parts (mapcar 'atoi (split-string str "[, ]+"))) (if (and (= (length parts) 3) (<= 0 (car parts) 255) (<= 0 (cadr parts) 255) (<= 0 (caddr parts) 255)) (list :rgb (+ (lsh (car parts) 16) (lsh (cadr parts) 8) (caddr parts)) (apply 'strcat (mapcar 'itoa parts))) (prompt "\n无效的RGB格式! 必须为三个0-255的整数,用逗号分隔 (如:255,0,0)"))) ;; 处理数字输入 ((numberp (setq num (read str))) (cond ((<= 0 num 255) (list :index num)) ((<= 256 num 16777215) (list :truecolor num)) (T (prompt "\n颜色值超出范围! 索引色为0-255,真彩色为256-16777215")))) ;; 处理颜色名称 (T (list :name (strcase str))) ) ) ;; 修复的图层缓存函数 (defun build-layer-colors (/ tbl layer) (setq tbl '()) (setq layer (tblnext "layer" T)) ; 获取第一个图层 (while layer (setq tbl (cons (cons (cdr (assoc 2 layer)) (cdr (or (assoc 62 layer) '(62 . 7)))) ; 默认颜色7 tbl)) (setq layer (tblnext "layer")) ) tbl ) ;; 主程序 (setq cmde (getvar 'cmdecho)) (setq os (getvar 'osmode)) (setvar 'cmdecho 0) (setvar 'osmode 0) (setq found nil) ;; 用户输入处理 (initget "ByBlock ByLayer") (setq input (cond ((getkword "\n选择颜色类型 [ByBlock/ByLayer] <直接输入>: ")) ((getstring "\n输入颜色值 (索引色/真彩色/RGB): ")) )) (cond ;; 处理ByBlock ((= input "ByBlock") (if (setq ss (ssget "_X" '((62 . 0)))) (progn (sssetfirst nil ss) (setq found T) (princ (strcat "\n找到 " (itoa (sslength ss)) " 个ByBlock对象"))) (princ "\n未找到ByBlock颜色的对象"))) ;; 处理ByLayer ((= input "ByLayer") (if (setq ss (ssget "_X" '((62 . 256)))) (progn (sssetfirst nil ss) (setq found T) (princ (strcat "\n找到 " (itoa (sslength ss)) " 个ByLayer对象"))) (princ "\n未找到ByLayer颜色的对象"))) ;; 处理颜色值输入 (T (if (setq color-value (parse-color input)) (progn (setq layer-colors (build-layer-colors)) ; 构建图层缓存 (cond ;; 索引色处理 (0-255) ((eq (car color-value) :index) (setq ss (ssadd)) (foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "_X")))) (setq entdata (entget ent)) (setq color-index (cdr (assoc 62 entdata))) (cond ;; 直接匹配索引色 ((= color-index (cadr color-value)) (ssadd ent ss)) ;; 通过图层匹配 ((and (= color-index 256) ; ByLayer (setq layer-name (cdr (assoc 8 entdata))) (setq layer-color (cdr (assoc layer-name layer-colors))) (= layer-color (cadr color-value))) (ssadd ent ss)) ) ) (if (> (sslength ss) 0) (progn (sssetfirst nil ss) (setq found T) (princ (strcat "\n找到 " (itoa (sslength ss)) " 个索引色对象"))) (princ (strcat "\n未找到索引色: " (itoa (cadr color-value)) "的对象"))) ) ;; 真彩色处理 ((eq (car color-value) :rgb) (setq ss (ssget "_X" (list '(-4 . "<OR") (cons 420 (cadr color-value)) ; 真彩色整数 (cons 430 (caddr color-value)) ; 真彩色字符串 '(-4 . "OR>")))) (if ss (progn (sssetfirst nil ss) (setq found T) (princ (strcat "\n找到 " (itoa (sslength ss)) " 个RGB对象"))) (princ (strcat "\n未找到RGB: " (caddr color-value) "的对象"))) ) ;; 其他情况 (T (princ "\n不支持的颜色格式"))) ) (princ "\n无效的颜色输入")) ) ) ;; 恢复环境 (setvar 'osmode os) (setvar 'cmdecho cmde) (princ) ) ;;; 辅助函数:增强型字符串分割 (defun split-string (str regex / pos lst) (while (setq pos (vl-string-search regex str)) (setq lst (cons (substr str 1 pos) lst) str (substr str (+ pos 1 (strlen regex)))) ) (reverse (cons str lst)) ) ;;; 加载VL函数 (兼容旧版AutoCAD) (if (not (vl-string-search "vl-" (getvar "acadver"))) (arxload "vl.arx")) 上述代码依旧无法通过直接选择ByBlock(0)/ByLayer(256),或者直接输入(255,0,0)来选择对象
最新发布
06-13
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值