34 writing efficient code 编写有效的代码
	34.1 Memory 内存
34.1.1 Memory Copy: Do not Use libc in the Data Plane 内存拷贝:不要再数据面使用lic
数据面数据操作使用rte_memcpy()
34.1.2 Memory Allocation 内存申请
数据面动态分配内存使用rte_malloc()
34.1.3 Concurrent Access to the Same Memory Area 并发访问同一内存区域
			多核对同一内存区域的读写会产生很多数据缓存miss,性能消耗非常高。可以使用每核变量,例如,在统计的时候。
			·使用RTE_PER_LCORE
			·使用表结构(每个核一个,即每核的),这种情况,每个结构必须是cache-aligned(缓存对齐)
			读为主的变量可以被多核共享,而没有性能损耗,如果没有读写变量在同一个cache line。
34.1.4 NUMA 非统一内存访问
			访问本地内存,访问远地内存慢。
			memzone、ring、rte_malloc 和 mempool 提供了在指定的socket上创建池的接口。
		34.1.5 Distribution Across Memory Channels   分散访问内存通道
		
	34.2 Communication Between lcores 核间通信
		建议使用DPDK的ring,无锁环形队列。
		支持批量bulk和突发burst访问。
34.3 PMD Driver
		PMD可以工作在批量bulk/突发burst模式。
		PCI设备通过DMA写入系统存储时,如果写操作在完整的cache line上,而非部分cache line,那消耗很少。PMD中的代码,已采取行动避免部分写入。
	
		34.3.1 Lower Packet Latency 低数据包延迟
			传统上,吞吐和延迟间存在一个权衡。提高吞吐,导致延迟增大;相反降低延迟,导致吞吐变低。
			
			为了实现更高的吞吐,DPDK通过批量处理,来聚合单独处理每个包的消耗。
			
			数据包不会被发送,直到tail指针被网卡相应的发送队列更新。
为了始终保持低延迟,即使在高负载情况下,应用程序开发者也应该避免批量处理。把burst值调整为1,这样可以保证一次只处理一个包,但是会降低吞吐。
	34.4 Locks and Atomic Operations 锁和原子操作
		
		原子操作意味着在指令之前暗含着lock前缀,这会引起处理器的LOCK信号被断言在执行后续指令期间。这在多核环境下对性能有很大的影响。通过在数据平面避免锁机制,让性能得到提升。使用每核变量,使用RCU代替rwlock。
34.5 Coding Considerations 编码注意事项
34.5.1 Inline Functions 内联函数
使用 static inline ,小的函数可以在头文件中声明为静态内联。
34.5.2 Branch Prediction 分支预测
使用 likely()、unlikely()
34.6 Setting the Target CPU Type 设置目标CPU类型
编译优化 -O3
35 PROFILE YOUR APPLICATION 分析应用程序
	英特尔处理器提供的性能计数器来监控事件。由英特尔提供的一些工具可以用来分析和基准测试应用程序。请参阅从英特尔按VTune性能分析器必备出版物以获取更多信息。
	对于DPDK的应用程序,这可以在Linux应用程序只的环境中进行。
	
	应通过事件计数器进行监控的主要情况是:
	·Cache misses 高速缓存未命中
	·Branch mis-predicts 分支误预测
	·DTLB misses 
	·Long latency instructions and exceptions 长延迟指令和异常
	
	请参阅英特尔性能分析指南,了解应用程序分析的详细信息。
原文:http://www.cnblogs.com/yilipika/p/5019958.html