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

ChinaUnix.net

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

论坛徽章:
9
子鼠
日期:2014-10-11 16:46:482015亚冠之萨济拖拉机
日期:2015-05-22 11:38:53黑曼巴
日期:2016-07-19 15:03:1115-16赛季CBA联赛之四川
日期:2017-05-16 16:38:5515-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:552016科比退役纪念章
日期:2017-09-02 15:42:47
发表于 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


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

本版积分规则

10张SACC2017门票等你来拿~

在数字化转型时代,云已成为万物智能的数字化大脑。而随着大数据应用、人工智能、移动互联网等技术的飞速发展,“智慧 +” 的概念正在深入到各行各业,提升企业效率,释放商业潜能,创造全新机遇。作为国内顶级技术盛会之一,2017 中国系统架构师大会(SACC2017)将于 10 月 19-21 日在北京新云南皇冠假日酒店震撼来袭。今年,大会以 “云智未来” 为主题,云集国内外顶级专家,围绕云计算、人工智能、大数据、移动互联网、产业应用等热点领域展开技术探讨与交流。本届大会共设置 2 大主会场,18 个技术专场;邀请来自互联网、金融、制造业、电商等多个领域,100 余位技术专家及行业领袖来分享他们的经验;并将吸引 4000 + 人次的系统运维、架构师及 IT 决策人士参会,为他们提供最具价值的交流平台。
----------------------------------------
优惠时间:2017年10月19日前

活动链接>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP