为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【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)数据量越大,越明显

该性能问题我测试下,后续有结果给您进行反馈