注册

Golang驱动性能优化

LU.XL 2026/04/28 151 1

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:V8.1
【操作系统】:debian12
【CPU】:x86
【问题描述】*:官方安装包中提供的go语言驱动,使用批量插入数据数据时会导致进程CPU消耗过大。通过debug/pprof分析原因在
flat flat% sum% cum cum%
7.33s 85.53% 85.53% 7.36s 85.88% gitee.com/chunanyong/dm.namedValueToValue

源码如下:

func namedValueToValue(stmt *DmStatement, named []driver.NamedValue) ([]driver.Value, error) {

	dargs := make([]driver.Value, stmt.paramCount)
	for i, _ := range dargs {
		found := false
		for _, nv := range named {
			if nv.Name != "" && strings.ToUpper(nv.Name) == strings.ToUpper(stmt.serverParams[i].name) {
				dargs[i] = nv.Value
				found = true
				break
			}
		}

		if !found && i < len(named) {
			dargs[i] = named[i].Value
		}

	}
	return dargs, nil
}

时间复杂度O(n*n)
建议修改成如下方式

func namedValueToValue(stmt *DmStatement, named []driver.NamedValue) ([]driver.Value, error) {
	dargs := make([]driver.Value, stmt.paramCount)

	mNamed := make(map[string]driver.NamedValue)
	for _, v := range named {
		if v.Name != "" {
			mNamed[strings.ToUpper(v.Name)] = v
		}
	}

	for i := range dargs {
		key := strings.ToUpper(stmt.serverParams[i].name)
		if nv, ok := mNamed[key]; ok {
			dargs[i] = nv.Value
			continue
		}
		// 名称匹配失败,使用位置匹配
		if i < len(named) {
			dargs[i] = named[i].Value
		}
	}

	return dargs, nil
}

时间复杂度会降成O(2n)数据量越大,越明显

回答 0
暂无回答
扫一扫
联系客服