Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6269981
  • 博文数量: 2759
  • 博客积分: 1021
  • 博客等级: 中士
  • 技术积分: 4091
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-11 14:14
文章分类

全部博文(2759)

文章存档

2019年(1)

2017年(84)

2016年(196)

2015年(204)

2014年(636)

2013年(1176)

2012年(463)

分类: 架构设计与优化

2015-01-23 10:56:58

原文地址:程序优化方法 作者:shenyanxxxy

      1.一些重要的数据结构应该是Cache-Line对齐的,这样保证在一个cache line当中能够保存,如果不是Cache line对齐的,那么可能会产生重要的数据结构跨Cache-line,那么CPU需要访问两个Cache-Line才能拿到数据。
内存分配时可以使用更加高效的内存申请方法:TCMalloc,可以安装编译,并自动替代glibc里面的malloc,而不用为了适应TCMalloc,重新写一套系统。TCMalloc的原理是为了避免多线程申请内存的争用,使用Thread-Cache Malloc ,即每个线程都维护一个线程的私有数据,通过这种方法实现每个线程调用malloc的时候,都是从自己的线程的私有数据中读取数据,从维护的freelist里面申请内存。

TCMalloc的实现非常的精细,因为TCMalloc的研发者发现,系统lock/unlock的时间要消耗100ns,所以采用这种方式可以非常巧妙的避免多线程同时调用malloc的开销。
如下是获得线程的私有数据的方法:

点击(此处)折叠或打开

  1. inline ThreadCache* ThreadCache::GetThreadHeap() {
  2. #ifdef HAVE_TLS
  3.   // __thread is faster, but only when the kernel supports it
  4.   if (KernelSupportsTLS())
  5.     return threadlocal_data_.heap;
  6. #endif
  7.   return reinterpret_cast<ThreadCache *>(
  8.       perftools_pthread_getspecific(heap_key_));
  9. }

      2.正常的生产者-消费者模型采用队列的方式组织资源,当生产者将元素放入到请求队列中后,消费者从队列中删除元素,并处理该元素。如果生产者与消费者均采用pthread线程来实现,那么读写锁适用于多个消费者,且他们都是需要搜索这个队列。此时只是遍历整个队列,而非插入或删除操作时,这个时候使用读写锁最为合适。
      3.读memcached的代码发现,这里面有关thread的实现都放在thread.c当中,里面的函数均采用static声明,对外只留有一个接口,setup_thread
这样做实现了类似于c++中的封装的思想。
      4.好的程序,比如memcached,想要利用里面的代码,可以直接拿过来用。因为比如线程的部分与其他的业务逻辑并无太大的关联。
      5.Copy on write 只能够解决写时断电的问题,还是无法解决硬盘出现故障的问题。
      6. 为什么cache能够起作用,提高系统的性能,关键因素在于两点:时间局部性和空间局部性。
      7. 采用硬件加速,设计出更好的指令,使用SIMD ,单一指令多数据流的方式,避免了多次访存,当需要取数据的时候,不是去完一个操作数,再取另一个操作数,而是直接将所需的操作数都取回来,目前已经广泛的应用于视频的编解码处理中。
阅读(760) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~