Zadig 面向开发者的云原生 DevOps 平台/ 平台 • API/E2E/UI 自动化测试管理 • 与开发协同自动化验收 • 自动化测试效益分析 高效协同的测试管理 • 一套 YAML/Chart 模板管理数百微服务 • 每个技术栈抽象一套构建模板 • 运维统一工作流规范,开发自主使用 • 跨多项目复用模板 扫码查看易快报案例 强大免运维的模板库 • 系统纬度:集群、项目、服务、环境、工作流 • 项目纬度:构建、测试、部署, 随着中国车企全球增长,海外业务拓展带来全球研发、交付、推广和运营挑战,在这出海挑战中,早期路特斯的软件交付流程 是基于 Jenkins 流水线设计的, Jenkins 的部署与数据中心一一对应。由于路特斯使用的是混合云,且数据中心遍布海外,导 致 Jenkins 数量庞大,随着业务扩张,早期架构难以适应快速变化,大量重复的事务性工作使得运维的人力捉襟见肘。 Zadig 的引入助力解决了这些挑战,推动了研发交付的数字化转型。 环 境 和 o n l i n e 发 版 生 产 环 境 。 字节跳动 - 飞书场景一:主干开发主干发布 工具链: 飞书 + Gerrit + Zadig + 内部发布平台 技术栈: Go +git ( yml ) + 多集群 K8s 分支策略: 单分支 master 开发 环境策略: 4 套同构环境动态分配 测试管理: 500 API+E2E cases0 码力 | 59 页 | 81.43 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程chronize()) • 即可自动帮你检查错误代码并打印在终端,然后退出。还会 报告出错所在的行号,函数名等,很方便。 堆上分配试试? • 那你可能会想,难道是因为我的 ret 创建 在栈上,所以 GPU 不能访问,才出错的 ? • 于是你试图用 malloc 在堆上分配一个 int 来给 GPU 访问,结果还是失败了。 原因: GPU 使用独立的显存,不能访问 CPU 内存 和 CPU 各自使用着独立的内 存。 CPU 的内存称为主机内存 (host) 。 GPU 使 用的内存称为设备内存 (device) ,他是显卡上板载 的,速度更快,又称显存。 • 而不论栈还是 malloc 分配的都是 CPU 上的内存 ,所以自然是无法被 GPU 访问到。 • 因此可以用用 cudaMalloc 分配 GPU 上的显存, 这样就不出错了,结束时 cudaFree • 而且需要开启 --extended-lambda 开关。 • 为了只对 .cu 文件开启这个开关,可以用 CMake 的生成器表达式,限制 flag 只对 CUDA 源码生效,这样可以混合其他 .cpp 文件也不会发生 gcc 报错的情况了。。 如何捕获外部变量? • 如果试图用 [&] 捕获变量是会出错的,毕 竟这时候捕获到的是堆栈( CPU 内存)上 的变量 arr 本身,而不是0 码力 | 142 页 | 13.52 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器里面真正 K-V 对的一份深拷贝。你写入的只是这份拷贝 后的 V ,不是 map 中的那个 V 。 map 的遍历:遍历的同时修改怎么办? k v map 中的 堆空间 执行你这段代码 的栈空间 未初 始化 v2 要写入的数 执行中的代码 for (auto [k, v]: m) { v = v2; } • 我们现在遍历一个 map ,然后把他里面所有的 V 都设为 v2 ,要怎么做? 里面真正 K-V 对的一份深拷贝。你写入的只是这份拷贝 后的 V ,不是 map 中的那个 V 。 map 的遍历:遍历的同时修改怎么办? k v map 中的 堆空间 执行你这段代码 的栈空间 k v v2 要写入的数 执行中的代码 for (auto [k, v]: m) { v = v2; } • 我们现在遍历一个 map ,然后把他里面所有的 V 都设为 v2 ,要怎么做? ,不是 map 中的那个 V 。 map 的遍历:遍历的同时修改怎么办? k v map 中的 堆空间 执行你这段代码 的栈空间 k v2 v2 要写入的数 执行中的代码 for (auto [k, v]: m) { v = v2; } 你修改的是栈空间 ( 周树人 ) 管我堆空间 ( 鲁迅 ) 什么事? • 我们现在遍历一个 map ,然后把他里面所有的 V 都设为 v2 ,要怎么做?0 码力 | 90 页 | 8.76 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针,会误以 为输入的是 float 参数。 • 如果你输入的是 3 这样的 int 类型常量, C 语 言不会帮你检测到他和 “ %f” 其实是不匹配的,而 是直接把 int 类型的 4 个字节推到栈上作为 printf 的参数,而 printf 却会把这 4 个字节作为 浮点来处理。由于浮点的指数位处于高位,但整数 是 3 ,导致高位全是 0 ,所以 printf 误读出来的 float gcc 特有的 alloca(n) 函数,会在当前函数的栈上分配内存,函数退出 时也会自动释放。 如果不是固定长度为 4 的数组呢? • 但是 msvc 就不行,因为 alloca 是 gcc 特有的函数,微软比较笨,所以不支持。 • 因此栈上动态数组不是标准的 C 语言特 性,是无法跨平台使用的。 • 所以一般认为栈上的东西都是固定长度的 。 • DIDU_KNOW_TH malloc 函数:在堆上分配内存,实现动态数组 • 栈上不能动态分配内存,堆上就可以! • char a[4] 可以在编译期确定一片栈上的连 续内存,大小为 4 字节, 4 必须是常量 。 • 而调用 stdlib.h 的 malloc(n) 就可以从堆 上分配一段 n 字节的连续内存,这里的 n 就可以不是常量了。 • 栈上的内存会在函数退出时自动释放,而 堆上的内存不会,需要手动0 码力 | 128 页 | 2.95 MB | 1 年前3
Await-Tree Async Rust 可观测性的灵丹妙药 - 赵梓淇• 异步编程的共同优势 • async/await 关键字 • 用户态调度 • Async Rust 的独特优势 • Ownership 与 Lifetime • 无栈协程 Async Rust 回顾 Rust 的无栈协程抽象 — Future Async Rust 回顾 • 通过 poll 驱动的状态机 • 组合嵌套为调度单元: Task • async fn 语法糖 Async • 痛点:观测与调试工具无法理解灵活的执行逻辑 • Backtrace 不够直观 ( 调用栈 -> 调用树 ) • Tracing 无法追踪调用关系的变化 Async Rust 观测与调试的痛点 Async Rust 回顾 • 特性:用户态调度的无栈协程 • Pending Task 不存在栈空间 • 痛点:观测与调试工具无法还原 Pending Task 的执行状态 • 难以得知0 码力 | 37 页 | 8.60 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串当字符串长度小于 15 时, 还和局部小字符串缓存共享了空间。 _M_local_buf 是物理让字符串比较小的时候能 存储在栈上,如果超过 15 字节再去堆上分配空 间。这样能节省 new/delete 的一点性能开销。 例如 “ helloworld” 这个字符串只有 10 字节,他 实际上是存储在栈上的,这时 _M_p 会被设置为 指向 _M_local_buf 的首地址。 不过对于大字符串,这多出来的 8 capacity] 构型。 vector 没有采用小字符串优化…这是因为 string 面对的都 是 char , wchar_t 这种比较小的类型,且用户常用的字符 串往往比较短很容易放进 15 字节的局部栈空间里;然而 vector 面对的往往是比较大的数据结构,有时还有智能指 针, std::thread 这种具有非平凡构造 / 析构函数的类型。对 vector 来说保障 RAII 的安全更重要,所以没有冒险优化。 MSVC 经典笑话:烫烫烫屯屯屯 • Windows 的 MSVC 在 Debug 模式下会默认把未初始化的栈内存 填满 0xCC ( x86 的 INT3 单步中断指令),未初始化的堆内存填 满 0xCD 。 • 而 0xCCCC 在 GBK 编码中就是“烫”,所以如果不小心打印了栈上 未初始化的字符串数组,就会看到“烫烫烫”。 • 而 0xCDCD 在 GBK 编码中就是“屯”,所以如果不小心打印了堆上0 码力 | 162 页 | 40.20 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化配的开 销。对 func 需要被重复调用的情况很实用。 第 6 章:多维数组 C 语言静态数组 • float a[n]; 可以在栈上分配有 n 个元素的一维数组。 • 通过 a[i] 访问第 i 个元素。 • float a[n][m]; 可以在栈上分配 n 行 m 列的二维数组。 • 通过 a[i][j] 访问第 i 行,第 j 列的元素。 等一下……内存是一维的,为什么可以分配二维的数组? a[i][j] 翻译为 a[i * 4 + j] 。 C++ 静态数组 • arraya; 可以在栈上分配有 n 个元素的一维数组。 • 通过 a[i] 访问第 i 个元素。 • array , m> a; 可以在栈上分配 n 行 m 列的二维数组。 • 通过 a[i][j] 访问第 i 行,第 j 列的元素。 • array 和 C 0 码力 | 147 页 | 18.88 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化shared_ptr, weak_ptr • 存储在栈上(利于优化): • array, bitset, glm::vec, string_view • pair, tuple, optional, variant 存储在栈上无法动态扩充大小,这就是 为什么 vector 这种数据结构要存在堆上 ,而固定长度的 array 可以存在栈上 那么刚才那个例子改成 array 是不是就可 以自动优化成功了?你可以自己试试看,0 码力 | 108 页 | 9.47 MB | 1 年前3
JVM 内存模型Register JVM Stack Native Method Stack PC Register JVM Stack Native Method Stack 程序计数器、虚拟 机栈, native 栈 为线程私有 堆为线程共享 方法区为线程共享 Eden From Survivor To Survivor 新生代 Old Space 老年代0 码力 | 1 页 | 48.42 KB | 1 年前3
Rust与算法 - 谢波来估计 算步骤、算存储 Rust 基本数据结构复杂度 线性数据结构 非线性数据结构 总体来看,时间复杂度没有超过 O(n) 的! Rust 实现数据结构 • 栈 • 链表 • Vec Rust 实现数据结 构 栈 借助 Vec 容器 泛型支持 Option ? 链表 链接可能为空 多种迭代 Vec 借助链表 随机插入 插入新的 Vec Rust 实现算法 •0 码力 | 28 页 | 3.52 MB | 1 年前3
共 15 条
- 1
- 2













