{
  "schemaVersion": "0.11.0",
  "canonical": "https://www.pystone.net/notes/vectorized-programming/",
  "atlas": "https://www.pystone.net/?node=vectorized-programming#knowledge-atlas",
  "markdown": "https://www.pystone.net/notes/vectorized-programming.md",
  "context": "https://www.pystone.net/notes/vectorized-programming.context.json",
  "knowledgeVersion": "224c990773de.5fa8af6e39fa",
  "build": {
    "siteCommit": "224c990773de166d23a886306577dd90379529ce",
    "notesCommit": "5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a",
    "builtAt": "1970-01-01T00:00:00.000Z",
    "version": "224c990773de.5fa8af6e39fa"
  },
  "id": "note:vectorized-programming",
  "slug": "vectorized-programming",
  "title": "向量化编程",
  "type": "note",
  "visibility": "public",
  "idStability": "rename-stable",
  "author": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "publisher": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "aliases": [],
  "summary": "向量化编程 创建时间：2021/1/24 23:13",
  "contentRole": "unspecified",
  "isMoc": false,
  "mocRecognition": "none",
  "generated": false,
  "attribution": "unspecified",
  "domain": "10-计算机、信息技术与工程",
  "tags": [],
  "mocs": [],
  "contentHash": "25b194a30397e274a5a1a2453185603101d9fc133eaafbbb317e7afdfee2b2aa",
  "assets": [],
  "headings": [
    {
      "depth": 1,
      "text": "向量化编程",
      "anchor": "向量化编程",
      "citation": "https://www.pystone.net/notes/vectorized-programming/#%E5%90%91%E9%87%8F%E5%8C%96%E7%BC%96%E7%A8%8B"
    },
    {
      "depth": 2,
      "text": "向量化编程",
      "anchor": "向量化编程-1",
      "citation": "https://www.pystone.net/notes/vectorized-programming/#%E5%90%91%E9%87%8F%E5%8C%96%E7%BC%96%E7%A8%8B-1"
    },
    {
      "depth": 2,
      "text": "向量化编程与ECS",
      "anchor": "向量化编程与ecs",
      "citation": "https://www.pystone.net/notes/vectorized-programming/#%E5%90%91%E9%87%8F%E5%8C%96%E7%BC%96%E7%A8%8B%E4%B8%8Eecs"
    },
    {
      "depth": 3,
      "text": "核心思想",
      "anchor": "核心思想",
      "citation": "https://www.pystone.net/notes/vectorized-programming/#%E6%A0%B8%E5%BF%83%E6%80%9D%E6%83%B3"
    },
    {
      "depth": 2,
      "text": "面向对象编程与向量化编程的比较",
      "anchor": "面向对象编程与向量化编程的比较",
      "citation": "https://www.pystone.net/notes/vectorized-programming/#%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%BC%96%E7%A8%8B%E4%B8%8E%E5%90%91%E9%87%8F%E5%8C%96%E7%BC%96%E7%A8%8B%E7%9A%84%E6%AF%94%E8%BE%83"
    },
    {
      "depth": 3,
      "text": "二者的根本区别",
      "anchor": "二者的根本区别",
      "citation": "https://www.pystone.net/notes/vectorized-programming/#%E4%BA%8C%E8%80%85%E7%9A%84%E6%A0%B9%E6%9C%AC%E5%8C%BA%E5%88%AB"
    },
    {
      "depth": 3,
      "text": "向量化编程的优劣",
      "anchor": "向量化编程的优劣",
      "citation": "https://www.pystone.net/notes/vectorized-programming/#%E5%90%91%E9%87%8F%E5%8C%96%E7%BC%96%E7%A8%8B%E7%9A%84%E4%BC%98%E5%8A%A3"
    },
    {
      "depth": 4,
      "text": "优势",
      "anchor": "优势",
      "citation": "https://www.pystone.net/notes/vectorized-programming/#%E4%BC%98%E5%8A%BF"
    },
    {
      "depth": 4,
      "text": "劣势",
      "anchor": "劣势",
      "citation": "https://www.pystone.net/notes/vectorized-programming/#%E5%8A%A3%E5%8A%BF"
    },
    {
      "depth": 4,
      "text": "策略",
      "anchor": "策略",
      "citation": "https://www.pystone.net/notes/vectorized-programming/#%E7%AD%96%E7%95%A5"
    },
    {
      "depth": 2,
      "text": "关于多线程",
      "anchor": "关于多线程",
      "citation": "https://www.pystone.net/notes/vectorized-programming/#%E5%85%B3%E4%BA%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B"
    },
    {
      "depth": 3,
      "text": "关于数据加锁",
      "anchor": "关于数据加锁",
      "citation": "https://www.pystone.net/notes/vectorized-programming/#%E5%85%B3%E4%BA%8E%E6%95%B0%E6%8D%AE%E5%8A%A0%E9%94%81"
    }
  ],
  "claims": [],
  "outgoing": [],
  "incoming": [
    {
      "id": "note:programming-languages-and-runtimes",
      "title": "编程语言与运行时",
      "url": "https://www.pystone.net/notes/programming-languages-and-runtimes/",
      "atlas": "https://www.pystone.net/?node=programming-languages-and-runtimes#knowledge-atlas",
      "label": "编程语言与运行时",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "本层中的“向量化编程”导航项",
      "citation": "https://www.pystone.net/notes/programming-languages-and-runtimes/#%E6%9C%AC%E5%B1%82"
    }
  ],
  "contentMarkdown": "# 向量化编程\n> 创建时间：2021/1/24 23:13\n\n## 向量化编程\n\n## 向量化编程与ECS\n\n### 核心思想\n\n  * 高频操作 —— 向量化执行\n\n  * 低频操作 —— 顺序执行\n\n当遇到数量级比较大的操作，想办法把它向量化，低频操作（例如只出现一次的操作）还是用顺序化的方式去写。\n\n## 面向对象编程与向量化编程的比较\n\n### 二者的根本区别\n\n面向对象编程，实际上是把人对事物的理解，或者是说一种抽象的规则，转换为计算机的代码，或者算法。\n向量化编程，需要自己去摸索一套管理的代码，考虑如何管理这些Component。\n\n> Component和对象是不一样的，Component是离散的，任何东西都可以是Component，很灵活，不局限于一个对象，或者一种Entity，他可以加到不懂种类的Entity上面去，复用度高，灵活性大。越是灵活的东西，越容易出错。\n\n### 向量化编程的优劣\n\n#### 优势\n\n  * 代码调用树的深度低于面向对象编程，能够产生争议的点比较少。\n\n  * 代码管理的成本低一些。\n\n  * System代码基本不需要时间去读，定义好数据结构，就了解了算法\n\n> System代码做的事实际上就是把数组A变成数组B\n\n#### 劣势\n\n  * 起点较高：老技术，由于“反人类”思维，流行程度低于面向对象编程\n\n  * 算法从单线程改为多线程，难度较高。\n\n  * 顺序执行代码Boilerplate较多\n\n> 面向对象编程时，要获取一个类的成员，”点“一下，就可以方便地获取与修改成员\n>  ECS在获取数据时，需要GetComponentData，修改地话，还需要SetComponentData，来把数据的修改设置回去。\n\n#### 策略\n\n从项目管理的角度将，平常写的时候，就用面向对象的、顺序话的编程即可。在最终优化时，如果性能上确实需要优化，又存在大量重复操作，再将这部分操作变成向量化编程。低频操作任然保留。\n\n## 关于多线程\n\n### 关于数据加锁\n\n要先把数据拆分的比较细，对某个操作进行评估，看这个操作需要哪些数据，把这些问题都想好了，这个问题才比较好解决。如果一个很长的代码。\n\n> 大量的玩家同时登陆服务器——以分流、分服务器的方式去解决。实际上没有提高一个计算单元的效率。可以考虑对重复的操作统一同时进行（如登陆服务器、验证用户名密码，反馈结果），当接收到玩家的登陆请求以后，把ID和密码缓存到数组里面，在需要对数据库进行查询的时候（查询实际上是非常耗时的过程，同时又是一个很容易多线程、向量化的操作，尤其是需要读磁盘上的数据库），把很多玩家的用户名和密码同时发给服务器，服务器做一个批量的查询，也是一个提高效率的好方法。\n"
}
