忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12下一页
最近访问板块 发新帖
查看: 1421 | 回复: 15

使用字符串引用映射文件句柄模拟高速字符缓存 [复制链接]

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
发表于 2017-08-05 00:28 |显示全部楼层
用 Golang 写了一段时间代码,发现字符串是各种语言唯一通用的数据结构。

下面就用 Golang 的思考模式,写一段高速字符缓冲的代码:

  1. use 5.024;

  2. my $buffer = buffer();
  3. Write($buffer, "123456");
  4. Write($buffer, "hello");
  5. say string($buffer);
  6. Reset($buffer);
  7. Write($buffer, "world");
  8. say string($buffer);


  9. sub buffer {
  10.    my $str = q{};
  11.    return \$str;
  12. }

  13. sub Reset {
  14.    my $buffer = shift;
  15.    ${$buffer} = q{};
  16.    return 1;
  17. }

  18. sub string {
  19.    my $buffer = shift;
  20.    return ${$buffer};
  21. }

  22. sub Write {
  23.    my ($buffer, $str) = @_;
  24.    open my ($str_fh), '>>', $buffer;
  25.    print {$str_fh} $str;
  26.    return 1;
  27. }
复制代码
输出:
  1. $ perl buffer.pl
  2. 123456hello
  3. world
复制代码


打赏鼓励一下!

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2017-08-09 02:47 |显示全部楼层
XXle, 3Q~~

论坛徽章:
31
荣誉会员
日期:2011-11-23 16:44:17丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17天蝎座
日期:2014-08-21 17:18:48丑牛
日期:2014-08-29 16:06:45天秤座
日期:2014-08-29 10:12:18天秤座
日期:2014-08-26 16:18:20双子座
日期:2014-07-30 11:38:27寅虎
日期:2014-08-04 10:24:12IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:00
发表于 2017-08-10 17:27 |显示全部楼层
回复 1# 104359176

我虽然不懂 golang, 但我觉得 字符串 应该不能通用.
连数字好象都不行.

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
发表于 2017-08-11 02:16 |显示全部楼层
C 语言的字符串实际上是字符列表,而字符又是数字的一种变形。在大部分语言中,都能很容易的模拟使用。Perl 语言中的可以容纳不同数据类型的数组,
和嵌套数据结构,在静态类型语言中是不允许的。

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2017-08-25 00:33 |显示全部楼层
回复 1# 104359176

  1. my $buffer = buffer();
  2. Write($buffer, "123456");
  3. Write($buffer, "hello");
  4. say string($buffer);
复制代码
youhe butong?

  1. my $buffer;
  2. $buffer .= "123456";
  3. $buffer .= "hello";
  4. say $buffer;
复制代码
you ceshi guo ma?

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
发表于 2017-08-27 01:03 |显示全部楼层
回复 5# rubyish

没测试过,是不是有什么问题。
这两种写法的不同,对于 golang 来说,是不允许的,因为 buffer 和字符串是不同的类型,不能直接相加。
对于 Perl 语言,往缓冲里添加字符,比用字符串连接符号要高效。因为连接符号,要重建一个新的字符串。

这个代码只是按照静态语言的思路书写,用 Perl 的眼光来看,从语法上讲没必要。

但是为了追求更高效的应用,迟早要试着用静态语言的思路去写代码。

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2017-08-27 23:49 |显示全部楼层
本帖最后由 rubyish 于 2017-08-28 21:37 编辑

回复 6# 104359176

1 ge small test:
perl 5, version 26, subversion 0 (v5.26.0)


.=  # 0.48 s
fh  # 0.91 s



  1. my $X = 1000000;
  2. my $S = "hello";

  3. #A();    # 0.48
  4. B();    # 0.91

  5. sub A {
  6.     my $A;
  7.     for ( 0 .. $X ) { $A .= $S }
  8.     #say $A;
  9. }

  10. sub B {
  11.     my $A;
  12.     open my $F, '>', \$A;
  13.     for ( 0 .. $X ) { print $F $S }
  14.     #say $A;
  15.     close $F;
  16. }
复制代码


论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2017-08-27 23:59 |显示全部楼层
回复 1# 104359176

not good!

sub Write {
   my ($buffer, $str) = @_;
   open my ($str_fh), '>>', $buffer;
   print {$str_fh} $str;
   return 1;
}

write, write, write...
open, open, open......

论坛徽章:
10
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之山东
日期:2017-11-10 14:32:14
发表于 2017-08-28 08:55 |显示全部楼层
rubyish 有必要加强英文基础,或者想办法搞个中文输入法……
虽然我英语也不熟,不过大致可以说一些跛脚的,个别单词形式可能用不对:

1 ge small test -> one small test
you ceshi guo ma? -> did you test it?
youhe butong?  -> any difference ? / What is the difference?

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2017-08-29 01:32 |显示全部楼层
回复 6# 104359176

perl de string yijing daiyou buffer le,
yejiushi yixie qita yuyan de
stringBuffer, stringBuilder...

  1. use Devel::Peek;
  2. my $STR = '0';
  3. for ( 1 .. 100 ) {
  4.     Dump($STR);
  5.     $STR .= $_;
  6. }
复制代码


100 ci de concat resize zhiyou 10 ci.

10    7
20    6
32    6
48    8
68    10
92    12
120    14
156    18
200    19


SV = PV(0x24cb720) at 0x24e59c8
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0x24ee3f8 "01"\0     # 0x24ee3f8 ADDRESS
  CUR = 2                   # str-len  = 2
  LEN = 10                  # buf-size = 10

SV = PV(0x24cb720) at 0x24e59c8
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0x24ee3f8 "012"\0    # same ADDRESS
  CUR = 3                   # length + 1 = 3
  LEN = 10      

...

SV = PV(0x24cb720) at 0x24e59c8
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0x24e6210 "01234567"\0   # change ADDRESS
  CUR = 8
  LEN = 20                      # buf = 20


您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP