---
title: "向量化编程"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/vectorized-programming/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/02-编程语言与运行时/向量化编程.md"
content_hash: 25b194a30397e274a5a1a2453185603101d9fc133eaafbbb317e7afdfee2b2aa
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# 向量化编程
> 创建时间：2021/1/24 23:13

## 向量化编程

## 向量化编程与ECS

### 核心思想

  * 高频操作 —— 向量化执行

  * 低频操作 —— 顺序执行

当遇到数量级比较大的操作，想办法把它向量化，低频操作（例如只出现一次的操作）还是用顺序化的方式去写。

## 面向对象编程与向量化编程的比较

### 二者的根本区别

面向对象编程，实际上是把人对事物的理解，或者是说一种抽象的规则，转换为计算机的代码，或者算法。
向量化编程，需要自己去摸索一套管理的代码，考虑如何管理这些Component。

> Component和对象是不一样的，Component是离散的，任何东西都可以是Component，很灵活，不局限于一个对象，或者一种Entity，他可以加到不懂种类的Entity上面去，复用度高，灵活性大。越是灵活的东西，越容易出错。

### 向量化编程的优劣

#### 优势

  * 代码调用树的深度低于面向对象编程，能够产生争议的点比较少。

  * 代码管理的成本低一些。

  * System代码基本不需要时间去读，定义好数据结构，就了解了算法

> System代码做的事实际上就是把数组A变成数组B

#### 劣势

  * 起点较高：老技术，由于“反人类”思维，流行程度低于面向对象编程

  * 算法从单线程改为多线程，难度较高。

  * 顺序执行代码Boilerplate较多

> 面向对象编程时，要获取一个类的成员，”点“一下，就可以方便地获取与修改成员
>  ECS在获取数据时，需要GetComponentData，修改地话，还需要SetComponentData，来把数据的修改设置回去。

#### 策略

从项目管理的角度将，平常写的时候，就用面向对象的、顺序话的编程即可。在最终优化时，如果性能上确实需要优化，又存在大量重复操作，再将这部分操作变成向量化编程。低频操作任然保留。

## 关于多线程

### 关于数据加锁

要先把数据拆分的比较细，对某个操作进行评估，看这个操作需要哪些数据，把这些问题都想好了，这个问题才比较好解决。如果一个很长的代码。

> 大量的玩家同时登陆服务器——以分流、分服务器的方式去解决。实际上没有提高一个计算单元的效率。可以考虑对重复的操作统一同时进行（如登陆服务器、验证用户名密码，反馈结果），当接收到玩家的登陆请求以后，把ID和密码缓存到数组里面，在需要对数据库进行查询的时候（查询实际上是非常耗时的过程，同时又是一个很容易多线程、向量化的操作，尤其是需要读磁盘上的数据库），把很多玩家的用户名和密码同时发给服务器，服务器做一个批量的查询，也是一个提高效率的好方法。
