cos-speed-test.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package main
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "net/http"
  7. "net/url"
  8. "os"
  9. "strconv"
  10. "strings"
  11. "time"
  12. "github.com/tencentyun/cos-go-sdk-v5"
  13. "github.com/tencentyun/cos-go-sdk-v5/debug"
  14. )
  15. type Config struct {
  16. SecretID string
  17. SecretKey string
  18. Region string
  19. Bucket string
  20. }
  21. func log_status(err error) {
  22. if err == nil {
  23. return
  24. }
  25. if cos.IsNotFoundError(err) {
  26. // WARN
  27. fmt.Println("WARN: Resource is not existed")
  28. } else if e, ok := cos.IsCOSError(err); ok {
  29. fmt.Printf("ERROR: Code: %v\n", e.Code)
  30. fmt.Printf("ERROR: Message: %v\n", e.Message)
  31. fmt.Printf("ERROR: Resource: %v\n", e.Resource)
  32. fmt.Printf("ERROR: RequestId: %v\n", e.RequestID)
  33. // ERROR
  34. } else {
  35. fmt.Printf("ERROR: %v\n", err)
  36. // ERROR
  37. }
  38. }
  39. func main() {
  40. // 解析配置
  41. fileptr, err := os.Open("config.json")
  42. if err != nil {
  43. fmt.Printf("Failed to open config file:%s", err.Error())
  44. return
  45. }
  46. defer fileptr.Close()
  47. var config Config
  48. decoder := json.NewDecoder(fileptr)
  49. err = decoder.Decode(&config)
  50. if err != nil {
  51. fmt.Println("Decoder json failed", err.Error())
  52. return
  53. } else {
  54. fmt.Printf("Region:%s, Bucket:%s\n", config.Region, config.Bucket)
  55. }
  56. var cosurl string
  57. cosurl = "http://" + config.Bucket + ".cos." + config.Region + ".myqcloud.com"
  58. u, _ := url.Parse(cosurl)
  59. b := &cos.BaseURL{BucketURL: u}
  60. c := cos.NewClient(b, &http.Client{
  61. Transport: &cos.AuthorizationTransport{
  62. SecretID: config.SecretID,
  63. SecretKey: config.SecretKey,
  64. Transport: &debug.DebugRequestTransport{
  65. RequestHeader: false,
  66. // Notice when put a large file and set need the request body, might happend out of memory error.
  67. RequestBody: false,
  68. ResponseHeader: false,
  69. ResponseBody: false,
  70. },
  71. },
  72. })
  73. testSizeArray := [...]int{1024 * 1024, 4 * 1024 * 1024}
  74. testTimes := 10
  75. var totalComsumeTime int
  76. var speed, avgSpeed float32
  77. for _, size := range testSizeArray {
  78. sizeInMb := size / (1024 * 1024)
  79. fmt.Printf("============test upload %dMB file===============\n", sizeInMb)
  80. testStr := strings.Repeat("t", size)
  81. testFilenamePrefix := "testfile" + strconv.Itoa(sizeInMb) + "MB-"
  82. i := 0
  83. for i < testTimes {
  84. startTime := time.Now().UnixNano() / 1e6
  85. testKey := testFilenamePrefix + strconv.Itoa(i)
  86. testReader := strings.NewReader(testStr)
  87. resp, err := c.Object.Put(context.Background(), testKey, testReader, nil)
  88. if err != nil {
  89. fmt.Printf("upload failed")
  90. log_status(err)
  91. } else {
  92. endTime := time.Now().UnixNano() / 1e6
  93. consumeTimeMs := endTime - startTime
  94. totalComsumeTime += int(consumeTimeMs)
  95. speed = (float32)(sizeInMb) / ((float32)(consumeTimeMs) / 1000)
  96. fmt.Printf("succeed to upload %s, requestId: %s, httpCode: %s, consumeTime: %dms, speed: %0.2f MB/s\n",
  97. testKey, resp.Header.Get("x-cos-request-id"), resp.Status, consumeTimeMs, speed)
  98. // 删除对象
  99. //_, err := c.Object.Delete(context.Background(), testKey)
  100. //if err != nil {
  101. // fmt.Printf("failed to delete %s", testKey)
  102. //}
  103. i++
  104. }
  105. }
  106. avgSpeed = (float32)(sizeInMb*testTimes) / ((float32)(totalComsumeTime) / 1000)
  107. totalComsumeTime = 0
  108. fmt.Printf("\naverage upload speed %0.2f MB/s\n", avgSpeed)
  109. }
  110. for _, size := range testSizeArray {
  111. sizeInMb := size / (1024 * 1024)
  112. fmt.Printf("============test download %dMB file===============\n", sizeInMb)
  113. testFilenamePrefix := "testfile" + strconv.Itoa(sizeInMb) + "MB-"
  114. i := 0
  115. for i < testTimes {
  116. startTime := time.Now().UnixNano() / 1e6
  117. testKey := testFilenamePrefix + strconv.Itoa(i)
  118. resp, err := c.Object.GetToFile(context.Background(), testKey, testKey, nil)
  119. if err != nil {
  120. fmt.Printf("download failed")
  121. log_status(err)
  122. } else {
  123. endTime := time.Now().UnixNano() / 1e6
  124. consumeTimeMs := endTime - startTime
  125. totalComsumeTime += int(consumeTimeMs)
  126. speed = (float32)(sizeInMb) / ((float32)(consumeTimeMs) / 1000)
  127. fmt.Printf("succeed to download %s, requestId: %s, httpCode: %s, consumeTime: %dms, speed: %0.2f MB/s\n",
  128. testKey, resp.Header.Get("x-cos-request-id"), resp.Status, consumeTimeMs, speed)
  129. // 删除对象
  130. _, err := c.Object.Delete(context.Background(), testKey)
  131. if err != nil {
  132. fmt.Printf("failed to delete %s", testKey)
  133. }
  134. // 删除本地文件
  135. os.Remove(testKey)
  136. i++
  137. }
  138. }
  139. avgSpeed = (float32)(sizeInMb*testTimes) / ((float32)(totalComsumeTime) / 1000)
  140. totalComsumeTime = 0
  141. fmt.Printf("\naverage download speed %0.2f MB/s\n", avgSpeed)
  142. }
  143. fmt.Scanln()
  144. }