0%

实验室分享(二)

基本上就是把gnu的make的manual读了一遍,然后记录了一些自认为比较重要/经常用到的东西

代码变成可执行文件,叫做编译。对于一般的C文件,一般有以下过程

1
2
3
4
# 编译生成.o文件
cc -c main.c
# 链接生成可执行文件 main
cc main.o -o main
阅读全文 »

实在是看不太下去,而且似乎并没有学到什么,也就没有做笔记

建议直接看一篇中文博客,似乎就是这个章节的翻译

这篇主要讲的讲的是作者不断完善SocialCalc的过程以及遇到的一些问题的解决方法
可以认为是协同文档的一种

简单记录一下:

  1. 通过发送操作本身而不是整个表的内容,来减少带宽的使用量,并且允许在不稳定的网络下恢复之前的操作

  2. 使用PocketIO中间件来使得一些不支持socket的老版本浏览器也可以兼容

  3. 当一个文档使用了很久然后一个新的成员添加进来的时候,可能会导致新的成员需要在本地执行非常多的指令才可以达到其他成员目前的状态,并且在此期间无法进行任何的修改
    通过snapshot的机制来进行弥补,比如说每执行100条指令,server就会从所有的client中拉取其目前的最新文档,并且将最新的文档保存在log中,之后新加入的成员就只需要拉取最近的一次snapshot并执行至多99条指令就可以达到最新的状态。但是也会有新的问题,比如说服务器无法对不同版本的文档进行判别,而且如果出现恶意的(malicious)的快照,后续的所有的新加入的成员都有可能拿到错误的文档。

    其实可以发现导致上述问题的原因就是因为服务器没有执行js(command也就是指令)的能力,所以后来作者用Node.js重写了server,使得客户端有了执行js的能力,但也因此损失了一部分的并发能力以及延迟。

  4. 因为server每次执行一个命令都需要在本地对html进行渲染,就导致CPU直接被卡死,之前使用的jsdom效率不够高,所以作者用LiveScript写了一个简单的DOM来实现HTML的export。上述问题得到了解决

  5. 使用W3C的Web Worker API使得代码可以利用多核CPU的性能优势

由于最近看的一本书(TPOSA)中的第一章讲的就是Chromium,所以突然就想下载一下源码,然后又想要不就试试编译一下?

首先官方有一个指导文档

可能不会列出所有的可能性,但是还是稍微记录一下我本人的具体步骤以及踩过的坑吧

时间:2020/12/17
Mac: macbook pro late 2013 15’
Mac系统版本: 10.15.7 (19H15)
Chromium版本(hash): a7361976c2c0be7139f4de8eb8844702a198f0cf

参考的博客

阅读全文 »

算是一本有点老的书了?因为之前大一的时候打印了出来一只没看,就想着要不找个时间看完算了

High Performance Networking in Chrome

1.2 The Many Facets of Performance

  1. Chrome是作为一个平台来设计的。在Chrome之前的浏览器都是单一进程,每一个页面共享同一个内存空间,如果某一个页面出了问题,那么其他的页面也可能会受到影响。而Chromes是多进程来工作的。每一个tab页面都是一个单独的进程,拥有自己的内存空间以及一个沙箱(sandbox)

  2. 浏览器的工作主要就是三个步骤

    • 获得资源
    • 页面渲染
    • 执行脚本
      其中页面渲染和脚本的执行是单线程并且交错执行的(single-threaded, interleaved model of execution)–无法对DOM进行并发的修改,这其中一部分是因为js本身是单线程执行的语言。所以提速的方向主要是在如何将两者一起结合起来快速的运行。
  3. Chrome使用Blink作为layout引擎。而对于js,Chrome实现了V8 runtime

  4. 浏览器对不同网络资源能够根据其延迟等信息来进行优先级的判定是非常重要的一点

阅读全文 »

  1. 禁止拷贝(或其他操作)
    一般来说,对于普通的功能,我们不想要支持只需要不实现即可,但是对于赋值等操作,如果我们不实现,那么编译器会帮我们自动生成。所以我们可以通过将拷贝函数设定为private的方式来避免调用,然而这样还是可能会出问题,因为友元函数/类的存在,所以还是有机会调用这个函数,所以我们可以通过只声明而不定义拷贝函数,使得调用者在链接的时候报错,从而避免拷贝。

    C++11支持使用delete关键字来非常方便的实现上述功能

阅读全文 »

C++ primer 看到了智能指针什么的,并且之后的几章看的有点粗略,就没有做多少笔记,之后抽时间看,直接开始看effective c++

由于书中的每一个Item涉及到的内容还是很多的,所以在每一个Item当中又会分出几个小点进行记录

  1. 使用constenum以及inline而不是#define
    本节也可以被总结为,使用编译器而不是预处理器

    • const
      const#define最容易产生交叉的点在于对常量的定义,当我们想要定义一个常量的时候,我们可能使用以下两种方式

      1
      2
      3
      #define ASPECT_RATIO 1.653

      const double AspectRatio = 1.653;

      由于在编译的过程中,所有的ASPECT_RATIO将会被完全替换为1.653。如果我们使用的是一个基于符号表的调试器,那么我们可能根本不知道1.653从何而来,尤其是在使用他人编写的头文件中定义了该宏的时候。但是使用const单独定义一个常量将不会有这个问题。而且也有某种可能上,使用const所生成的代码要比使用#define得到的代码更少,因为预处理器的无脑替换,有可能在最终生成的.o文件中有很多重复的1.653,而使用const double按理来说不会超出一个.

阅读全文 »