最近看代码的一点总结

最近看了些libevent的源码, 发现自己的技术还差的很远。

之前写程序总习惯自己实现。有的东西自己掌握不牢,或者没有接触到新的技术,总是用笨方法写出不好看的代码。之前对TCP/IP,网络编程不是很熟悉,实现的TCP客户端断线重连就很弱。 实现的服务器端监听端口,同时处理多个连接的程序,没有理解清楚one connection one thread的思想,写的代码不够简洁高效。

还是在一次面试中遇到select/poll/epoll相关的问题,之后我才开始在网上以及书上注意到IO多路复用相关的东西。看了不少文档,却没有实际使用过。心里对epoll模型有点畏难的感觉。用过一点select。 最近有机会在网络通信模块中使用epoll实现 事件驱动event loop模型。看了写网上的样例代码,发现使用起来很容易。linux系统库带的功能,接口也比较清晰。

epoll模型的epoll_data结构体的定义很巧妙,通过int和指针的联合变量定义,让使用时既可以直接使用socket fd,也可以自定义结构体。使ptr指向自定义结构体能够提供很好的灵活性,有很多跟事件绑定的东西都可以组织起来,比如回调函数,fd对应客户端的状态变迁等。这样 事件处理的对象就不仅仅是一个IO fd了,可以是fd代表的其他东西。

The struct epoll_event is defined as :
typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;

最近也看到一个104规约解析的源码mrts,它的数据结构定义的很巧妙,通过定义的struct,避免了频繁的指针强制转换。我之前自己实现的解析程序,主要就是将char类型的报文对应位置强制指针转换来解析的,代码复杂,可读性太差。

/* CP56Time2a timestamp */
typedef struct cp56time2a {
u_short msec;
u_char min :6;
u_char res1 :1;
u_char iv :1;
u_char hour :5;
u_char res2 :2;
u_char su :1;
u_char mday :5;
u_char wday :3;
u_char month :4;
u_char res3 :4;
u_char year :7;
u_char res4 :1;
} cp56time2a __attribute__((__packed__));
/* M_ME_NC_1 - short floating point measured value */
struct iec_type13 {
float mv;
u_char ov :1; /* overflow/no overflow */
u_char res :3;
u_char bl :1; /* blocked/not blocked */
u_char sb :1; /* substituted/not substituted */
u_char nt :1; /* not topical/topical */
u_char iv :1; /* valid/invalid */
}__attribute__((__packed__));

看了点git相关的东西。git和svn的语法还是比较像的,不同的主要是分布式和客户端/服务器模式的区别。另外git的分支branch看起来很有用,有机会一定要试试。

github上有很多不错的源码,配合git,以后阅读源码也方便了。

libevent库中有时间事件的处理,里面提到用小根堆来管理超时时间,时间复杂度O(logn)。libevent用sockpair将 信号的事件处理模型统一到event loop中,相当与将信号处理转化为IO模型。我也是只看了个大概。 之前一直以为 课程上学的堆,动态规划等较复杂的数据结构和算法工作中几乎用不到,现在才知道不是用不到,是自己懒或者畏难。

最近改别人的代码发现 变量命名,数据结构的定义,程序逻辑的设计,代码注释都是很重要的。代码可读性对维护,修改,升级的效率影响很大。同时,工作如果没有责任心,对自己较高的要求,写出的代码往往漏洞百出,只能应付差事。这对于之后的维护是个灾难。  整体的架构,逻辑设计,以及数据结构设计很重要。设计尽量简单高效,层次过多会让人难以理解,通常效率也不会好。

英语很重要。酷壳的陈皓都说英语是计算机工作人员很重要的一项技能。

最近看代码的一点总结

时间: 2024-08-27 18:46:07

最近看代码的一点总结的相关文章

准程序员该如何看代码

> 刚上大学的时候,对于一个连c是什么都不知道的我来说,问的最多的问题便是,软件工程专业的学生该如何学习.听到的最多的答案就是:"多看代码,多写代码."如今,过去了三年,作为准程序员的我已经实习了一段时间,面对每天看的代码,又如刚上大学时那般迷茫,我该如何看代码呢? "学而不思则罔,思而不学则殆",是时候该合上显示屏,好好想想了. 首先应该认识两点,第一,学习编程不是照着代码敲就可以的.以前看了很多书,看了很多视频,照着敲的代码也有很多k了,可真正成为自己的却

webpack 代码分割一点事

webpack 俨然已经成为前端最主流的构建工具,其功能多种多样,我们今天就来分析下关于代码分割这部分的一点事,并在最后讲述如何实现在webpack编译出的代码里手动添加一个异步chunk. 什么是chunkId与moduleId? 每个chunkId对应的是一个js文件,每个moduleId对应的是一个个js文件的内容的模块(一个js文件里面可以require多个资源,每个资源分配一个moduleId),所以它两的关系就是一个chunkId可能由很多个moduleId组成. 在webpack

阅读xtrabackup代码的一点笔记

xtrabackup binary最重要的两个过程是backup和prepare,对应的函数分别是xtrabackup_backup_func()和xtrabackup_prepare_func(),这里做一些阅读代码时的笔记. xtrabackup backup的线程模型: 1. 一个log拷贝线程: 2. n个ibd文件拷贝线程: 3. 一个io监控线程: 4. 通过suspend_start/suspend_end文件来标注是否启动终止线程: typedef struct { datafi

calltree看代码调用图

calltree是在linux下面看c代码(尤其是复杂的内核代码)的神器. 推荐  calltree+vim + ctags + cscope + taglist [ vim: 搭建vim看代码的环境   http://www.cnblogs.com/mylinux/p/5013588.html] 或者 calltree + source insight source insight能方便地查看向上和向下的函数(变量等)调用关系,并且支持多种语言,几乎是无可替代的.但调用深度太大的时候,人就记不

看代码和写代码还是很不同的

代码看懂了不难,但是简单的代码从头到尾写出来也不容易. 写个TCP服务器&客户端.是从UDP改过来的,那费老劲了. 最开始listen出错,原来SOCK_DGRAM忘记修改为SOCK_STREAM了, 接着发现listen的端口不对,原来忘记bind了, 后面发现客户端发送数据服务端接收不到,再看代码,原来都没有accept/connect. 加上accept和connect,客户端提示成功了,但是服务端没有返回,查了半天,发现客户端忘记把SOCK_DGRAM修改为SOCK_STREAM了. 太

代码块练习题:看代码写程序的执行结果。

1 /* 2 代码块练习题: 3 看代码写程序的执行结果. 4 5 输出结果是: 6 林青霞都60了,我很伤心 7 我是main方法 8 Student 静态代码块 9 Student 构造代码块 10 Student 构造方法 11 Student 构造代码块 12 Student 构造方法 13 */ 14 15 class Student { 16 static { 17 System.out.println("Student 静态代码块"); 18 } 19 20 { 21 S

某日看代码对代码可读性的思考

缘起 今天去看编译模块的代码,发现实在是看不进去.究其原因,就是设计得有些混乱.这提醒了我,很多时候写代码的时候不会注意到一些设计上的问题.在阅读别人代码的时候会非常清晰地表现出来.其中有一些典型的问题. 命名之设计模式 比如使用了某种设计模式,但是命名却没有符合那个设计模式的规范.导致看了代码许久,才反应过来:"原来这里使用了××设计模式啊". 命名之方法内容 经常有些方法叫:"build××".但是其实里面的内容远多于build一个实体对象.而是包含了很多查询.

剥开比原看代码11:比原是如何通过接口/create-account创建帐户的

作者:freewind 比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 在前面,我们探讨了从浏览器的dashboard中进行注册的时候,数据是如何从前端发到后端的,并且后端是如何创建密钥的.而本文将继续讨论,比原是如何通过/create-account接口来创建帐户的. 在前面我们知道在API.buildHandler中配置了与创建帐户相关的接口配置:

看代码网备份|利用WebClient|eKing.CmdDownLoadDbBakOper|实现定时拷贝数据库备份文件到文件服务器

摘要: 1.有两台服务器 (1)看代码网(记为A):内网IP:10.186.73.30 (2)文件服务器(记为B):内网IP:10.135.87.157 2.在A架设一个网站,端口8088(防火强设置B才能访问) 3.在B运行计划任务,每天定时从A的8088端口网站下载数据库备份文件到B 优点: 1.利用iis,无需架设ftp 2.利用防火墙,确保只能指定IP和端口可以访问 3.利用windows计划任务,每天定时备份 4.备份成功邮件定时提醒 原文链接: http://www.lookdaim