ARTS-week27

Algorithms

Happy Number

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
bool isHappy(int n) {
unordered_set<int> res;
while (res.find(n) == res.end()) {
res.insert(n);
n = sum_squares(n);
}
res.clear();
return n == 1;
}
private:
int sum_squares(int n) {
int sum = 0;
while (n != 0) {
sum += (n % 10) * (n % 10);
n = n / 10;
}
return sum;
}
};

Remove Linked List Elements

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
if (!head) {
return NULL;
}
head->next = removeElements(head->next, val);
return head->val == val ? head->next : head;
}
};

Review

本周阅读英文文章 How to extend Python with C/C++ Code

Technique

本周在《磁盘 I/O 性能优化的几个思路》学习了对文件系统和磁盘性能进行基准测试的工具fio(Flexible I/O Tester)。他提供了大量的可定制化选项,可以用来测试,裸盘或者文件系统在各种场景下的I/O性能,包括了不同块大小、不同I/O引擎以及是否使用缓存等场景。
常见命令:

1
2
3
4
5
6
7
8
9
10
11
# 随机读
fio -name=randread -direct=1 -iodepth=64 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb

# 随机写
fio -name=randwrite -direct=1 -iodepth=64 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb

# 顺序读
fio -name=read -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb

# 顺序写
fio -name=write -direct=1 -iodepth=64 -rw=write -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb

其中参数:
direct,表示是否跳过系统缓存,设置为1,就表示跳过系统缓存。
iodepth, 表示使用异步I/O(asynchronous I/O,简称 AIO)时,同时发出的I/O请求上限。
rw, 表示使用I/O模式,read/write分别表示顺序读/写,randread和randwrite分别表示随机读/写。
ioengine, 表示I/O引擎,它支持同步(sync)、异步(libaio)、内存映射(mmap)、网络(net)等各种I/O引擎。
bs, 表示I/O大小。
filename, 表示文件路径,可以是磁盘路径,也可以是文件路径。

还可以使用blktrace结合fio,实现对应用程序I/O模式的基准测试。

1
2
3
4
5
6
7
8
9
10
11
12
# 使用blktrace跟踪磁盘 I/O,注意指定应用程序正在操作的磁盘
$ blktrace /dev/sdb

# 查看blktrace记录的结果
# ls
sdb.blktrace.0 sdb.blktrace.1

# 将结果转化为二进制文件
$ blkparse sdb -d sdb.bin

# 使用 fio 重放日志
$ fio --name=replay --filename=/dev/sdb --direct=1 --read_iolog=sdb.bin

Share

《Web性能权威指南》WebSocket、WebRTC

WebSocket是浏览器中最通用最灵活的一个传输机制,其极简的API可以让我们在客户端和服务器之间以数据流的形式实现各种应用数据交换(包括JSON及自定义的二进制消息格式),而且两端都可以随时向另一端发送数据。

WebSocket资源URL采用了自定义模式:ws表示纯文本通信(如ws://example.com/socket),wss表示使用加密信道通信(TCP+TLS)。

WebSocket通信只涉及消息,应用代码无需担心缓冲、解析、重建接收到的数据。WebSocket协议不作格式假设,对应用的净荷也没有限制:文本或者二进制数据都没问题。从内部看,协议只关注消息的两个信息:净荷长度和类型(前者是一个可变长度字段),据以区别UTF-8数据和二进制数据。

Web Real-Time Communication(Web实时通信,WebRTC)由一组标准、协议和JavaScript API组成,用于实现浏览器之间(端到端)的音频、视频及数据共享。

0%