浏览代码

Pre-allocate some memory when reading files (#510)

Michael 6 年之前
父节点
当前提交
9fe267ffcf
共有 3 个文件被更改,包括 12 次插入7 次删除
  1. 6 0
      excelize_test.go
  2. 5 6
      lib.go
  3. 1 1
      rows_test.go

+ 6 - 0
excelize_test.go

@@ -1278,3 +1278,9 @@ func fillCells(f *File, sheet string, colCount, rowCount int) {
 		}
 	}
 }
+
+func BenchmarkOpenFile(b *testing.B) {
+	for i := 0; i < b.N; i++ {
+		OpenFile(filepath.Join("test", "Book1.xlsx"))
+	}
+}

+ 5 - 6
lib.go

@@ -22,14 +22,12 @@ import (
 // ReadZipReader can be used to read an XLSX in memory without touching the
 // filesystem.
 func ReadZipReader(r *zip.Reader) (map[string][]byte, int, error) {
-	fileList := make(map[string][]byte)
+	fileList := make(map[string][]byte, len(r.File))
 	worksheets := 0
 	for _, v := range r.File {
 		fileList[v.Name] = readFile(v)
-		if len(v.Name) > 18 {
-			if v.Name[0:19] == "xl/worksheets/sheet" {
-				worksheets++
-			}
+		if strings.HasPrefix(v.Name, "xl/worksheets/sheet") {
+			worksheets++
 		}
 	}
 	return fileList, worksheets, nil
@@ -58,7 +56,8 @@ func readFile(file *zip.File) []byte {
 	if err != nil {
 		log.Fatal(err)
 	}
-	buff := bytes.NewBuffer(nil)
+	dat := make([]byte, 0, file.FileInfo().Size())
+	buff := bytes.NewBuffer(dat)
 	_, _ = io.Copy(buff, rc)
 	rc.Close()
 	return buff.Bytes()

+ 1 - 1
rows_test.go

@@ -695,8 +695,8 @@ func TestErrSheetNotExistError(t *testing.T) {
 }
 
 func BenchmarkRows(b *testing.B) {
+	f, _ := OpenFile(filepath.Join("test", "Book1.xlsx"))
 	for i := 0; i < b.N; i++ {
-		f, _ := OpenFile(filepath.Join("test", "Book1.xlsx"))
 		rows, _ := f.Rows("Sheet2")
 		for rows.Next() {
 			row, _ := rows.Columns()