面向数据设计带来更好的性能


通过将应用数据放置在后续内存区域中获得更高性能。这使得CPU更容易加载和工作。

经典的面向对象编程 (OOP) 将其数据放在内存中,就像意大利肉酱面一样——对象和指针都混在一起了。这很好,直到您想对数据进行一些密集计算。

例如:您的系统中已有数十万个位置和产品,如何及早发现在两个仓库之间移动物品是否会对任何待处理订单产生负面影响?

如果您的对象图是在 OOP 中完成的,那么 CPU 预取器将在随机内存地址之间来回跳转。

性能可能是深层神经网络从未以OOP风格实现的原因:如果每个神经元和轴突都被表示为一个具有其字段的独立对象,那么一个给定的神经元的确切内存位置可能是不确定的。
相反,神经网络被使用数组、矩阵和张量,这对CPU或GPU来说是更自然和快速的工作方式。

幸运的是,有一种古老的编程方法叫做面向数据的设计:你想做什么就做什么,只要把你的数据结构化,以便有效地使用CPU。

其中一个方法是将数据放在连续的内存块中,这样CPU就可以很容易地预取所有需要的数据,并通过它进行咀嚼。

以我们案例为例,重构如下:

  • 将某一产品的所有库存位置集中在内存中。
  • 将它们表示为结构和数组。

// ProductStock captures stock quantities and reservations
// of a single product across all locations and warehouses.  
// it represents a tree that is flat in memory. The root  
// always contains totals.  
// We can easily fit stock availability for 100 products in CPU cache  
// allowing us to resolve availability or run kit calculations  
type ProductStock struct {  
   
// location IDs in the system  
   locs []int32  
   
// pointer to the parent location. -1 for root  
   parentIdx []int16  
   
// reservation and availability counts  
   reserved []int32  
   onHand   []int32  
}

这意味着:只要代码的执行触及任ProductStock,那么该产品的所有位置都可能已经在CPU缓存中,所以跨多个地点的计算会更便宜。