Golang-逃逸分析
逃逸分析是 Go 语言中的一种编译器优化技术,用于确定变量应在堆栈还是堆上分配。它是静态代码分析后的一个优化步骤,用于改善内存管理和提高程序速度。如果函数外没有引用,变量会优先被放置在堆栈中,因为堆栈比堆栈更快,但空间有限。如果函数外有引用,由于存在悬空指针的风险,变量必须放在堆上。逃逸分析可以将变量直接分配到堆,从而减少堆内存分配和 GC 压力。通过使用特定标志编译或检查汇编代码,可以查看转义分析的结果。常见的转义情况包括指针转义、堆栈空间不足以及引用对象的闭包。逃逸分析有助于正确分配内存,从而提高效率和性能。
Golang-数组与切片
Go 中的数组和分片都是顺序数据结构,但有一些关键的区别:数组是固定长度的,由存储的元素类型和大小定义;而分片可以理解为动态数组,与类型和长度无关。切片有一个结构,包含长度、容量和指向底层数组的指针,可以同时被多个切片引用。生成切片时,结果的容量是从数组的起点到终点。切片支持特殊方法,如在某些条件下扩展长度和容量。当切片用作函数参数时,函数内部的更改会因底层数组而生效。不过,分片没有并发控制,在并发环境中可能不安全。
Python性能分析实战1
前置知识
Python 基础语法
cProfile 基本使用
问题环境上发现有接口请求的响应时间高达10s以上,严重影响功能的使用
需要分析具体的代码执行耗时,针对问题代码进行优化,优化接口性能
解决思路分析代码执行情况使用 cProfile 工具,将目标接口的代码执行情况dump到文件中
123456with cProfile.Profile() as pf: # api business code # ... pf.dump_stats('api.prof')
获得dump文件后,使用 snakeviz 渲染方便查看
123snakeviz api.prof
执行命令后,snakeviz 会自动打开浏览器显示渲染后的结果
可以看到接口中调用的service方法耗时长达10s左右,根据图示的调用栈可以看到耗时久主要是跟一个decrypt方法有关
接下来到底下的搜索框过滤出关于decrypt相关的执行情况
可以看到,decrypt相关的方法被调用37次,每次耗时0.2s左右
0.2s算是比较耗时的操作了,这样耗时的代码逻辑居然还执行了37次,最终导致总耗时 ...
MongoDB副本集搭建
MongoDB副本集搭建概述
本文参照 MongoDB 官方文档(https://www.mongodb.com/docs/manual/tutorial/deploy-replica-set/#std-label-server-replica-set-deploy)进行实践基于单机环境,启动3个mongod进程模拟搭建mongo副本集(replica set)
实践环境
使用单台机器启动多个mongod进程模拟集群
操作系统(OS):
12$ cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
使用Docker构建Mongo环境
Docker版本:
12$ docker --versionDocker version 1.13.1, build 7d71120/1.13.1
Mongo镜像版本:
12$ docker images | grep mongodocker.io/mongo 4.2-bionic e301407a044e 6 months ago ...
LC17-电话号码的字母组合
电话号码的字母组合LeetCode题目链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number/
难度:中等
分析本题属于典型的递归回溯的题型,根据数字查找可使用的字母,在进行遍历递归回溯组合出所有可能的组合即可
思路
递归纵向遍历数字串(递归过程中当前遍历的索引即可实现递归纵向遍历)
根据数字取出对应的字母集合
遍历该集合组合结果
递归结束条件:当结果集中的字母和所给数字一样多时,即遍历结束
点我展开JavaGolang1123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657const ( CHAR_ONE = '1' CHAR_TWO = '2' CHAR_THREE = '3' CHAR_FOUR = '4' CHAR_FIVE = '5' CHAR_SIX = '6' ...
1.1-容器的基本操作和实现原理
容器的基本操作和实现原理容器是什么镜像就是一个特殊的文件系统它提供了容器中程序执行需要的所有文件。具体来说就是应用程序想要启动,需要三类文件:
相关的程序可执行文件、库文件和配置文件
这三类文件都被容器打包好了这样,在容器运行的时候就不再依赖宿主机上的文件操作系统类型和配置了
从用户使用的角度来看,容器和一台独立的机器或者虚拟机没有什么太大的区别但是它和虚拟机相比,却没有各种复杂的硬件虚拟层,没有独立的Linux内核
容器的所有进程调度、内存访问、文件读写都是直接跑在宿主机的内核之上的。
如何实现的两个术语
Namespace
Cgroups
这两项技术可以让程序在一个资源可控的独立(隔离)环境中运行,这个就是容器了。
Namespace查看docker容器中的进程情况
12345$ docker exec <containerID> ps -efPID USER TIME COMMAND 1 root 0:00 nginx: master process nginx -g daemon off; 24 nginx 0:01 ...
Windows激活
Windows激活Windows7专业版
管理员身份启动cmd
输入slmgr /skms kms.xspace.in
输入slmgr /ipkvk 7jg-NPHTm-C97Jm-9mPgT-3V66T
输入slmgr /ato
激活成功
企业版
管理员身份启动cmd
输入slmgr /skms kms.03k.org
输入slmgr /ipk 33PXH-7Y6KF-2VJC9-XBBR8-HVTHH
输入slmgr /ato
激活成功
LC165-比较版本号
比较版本号LeetCode题目链接:https://leetcode.cn/problems/compare-version-numbers/
难度:中等
分析思路
直接通过.切分字符串,遍历数组,直接使用内置函数将字符串转为数字进行比较,如果相等就继续比较,如果不等就直接返回结果
对于版本号长度不等的情况,只需将缺少的项视为0然后正常进行比较就行
点我展开JavaGolang12345678910111213141516171819202122232425class Solution { public int compareVersion(String version1, String version2) { String[] arr1 = version1.split("\\."); String[] arr2 = version2.split("\\."); int ret = 0; for (int i = 0;i < Math.max(arr1.length, arr2.length);i++) ...