mirror of
https://github.com/SunBK201/UA3F.git
synced 2025-12-19 10:17:31 +00:00
feat: optimize dump methods to use bufio.Writer for improved performance
This commit is contained in:
parent
beaaf678e3
commit
8132085c8c
@ -1,6 +1,7 @@
|
|||||||
package statistics
|
package statistics
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
@ -96,24 +97,31 @@ func (l *ConnectionRecordList) Dump() {
|
|||||||
}()
|
}()
|
||||||
|
|
||||||
l.mu.RLock()
|
l.mu.RLock()
|
||||||
var statList []ConnectionRecord
|
records := make([]*ConnectionRecord, 0, len(l.records))
|
||||||
for _, record := range l.records {
|
for _, r := range l.records {
|
||||||
statList = append(statList, *record)
|
records = append(records, r)
|
||||||
}
|
}
|
||||||
l.mu.RUnlock()
|
l.mu.RUnlock()
|
||||||
|
|
||||||
// Sort by start time (newest first)
|
// Sort by start time (newest first)
|
||||||
sort.SliceStable(statList, func(i, j int) bool {
|
sort.SliceStable(records, func(i, j int) bool {
|
||||||
return statList[i].StartTime.After(statList[j].StartTime)
|
return records[i].StartTime.After(records[j].StartTime)
|
||||||
})
|
})
|
||||||
|
|
||||||
for _, record := range statList {
|
w := bufio.NewWriter(f)
|
||||||
duration := time.Since(record.StartTime)
|
defer func() {
|
||||||
line := fmt.Sprintf("%s %s %s %d\n",
|
if err := w.Flush(); err != nil {
|
||||||
|
slog.Error("bufio.Writer.Flush", slog.Any("error", err))
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
now := time.Now()
|
||||||
|
for _, record := range records {
|
||||||
|
duration := now.Sub(record.StartTime)
|
||||||
|
_, err := fmt.Fprintf(w, "%s %s %s %d\n",
|
||||||
record.Protocol, record.SrcAddr, record.DestAddr, int(duration.Seconds()))
|
record.Protocol, record.SrcAddr, record.DestAddr, int(duration.Seconds()))
|
||||||
if _, err := f.WriteString(line); err != nil {
|
if err != nil {
|
||||||
slog.Error("os.File.WriteString", slog.Any("error", err))
|
slog.Error("Dump fmt.Fprintf", slog.Any("error", err))
|
||||||
return
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package statistics
|
package statistics
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
@ -84,21 +85,28 @@ func (l *PassThroughRecordList) Dump() {
|
|||||||
}()
|
}()
|
||||||
|
|
||||||
l.mu.RLock()
|
l.mu.RLock()
|
||||||
var statList []PassThroughRecord
|
records := make([]*PassThroughRecord, 0, len(l.records))
|
||||||
for _, record := range l.records {
|
for _, r := range l.records {
|
||||||
statList = append(statList, *record)
|
records = append(records, r)
|
||||||
}
|
}
|
||||||
l.mu.RUnlock()
|
l.mu.RUnlock()
|
||||||
|
|
||||||
sort.SliceStable(statList, func(i, j int) bool {
|
sort.SliceStable(records, func(i, j int) bool {
|
||||||
return statList[i].Count > statList[j].Count
|
return records[i].Count > records[j].Count
|
||||||
})
|
})
|
||||||
|
|
||||||
for _, record := range statList {
|
w := bufio.NewWriter(f)
|
||||||
line := fmt.Sprintf("%s %s %d %s\n", record.SrcAddr, record.DestAddr, record.Count, record.UA)
|
defer func() {
|
||||||
if _, err := f.WriteString(line); err != nil {
|
if err := w.Flush(); err != nil {
|
||||||
slog.Error("os.File.WriteString", slog.Any("error", err))
|
slog.Error("bufio.Writer.Flush", slog.Any("error", err))
|
||||||
return
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
for _, record := range records {
|
||||||
|
_, err := fmt.Fprintf(w, "%s %s %d %s\n",
|
||||||
|
record.SrcAddr, record.DestAddr, record.Count, record.UA)
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("Dump fmt.Fprintf", slog.Any("error", err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
package statistics
|
package statistics
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
@ -79,20 +80,28 @@ func (l *RewriteRecordList) Dump() {
|
|||||||
}()
|
}()
|
||||||
|
|
||||||
l.mu.RLock()
|
l.mu.RLock()
|
||||||
var statList []RewriteRecord
|
records := make([]*RewriteRecord, 0, len(l.records))
|
||||||
for _, record := range l.records {
|
for _, record := range l.records {
|
||||||
statList = append(statList, *record)
|
records = append(records, record)
|
||||||
}
|
}
|
||||||
l.mu.RUnlock()
|
l.mu.RUnlock()
|
||||||
|
|
||||||
sort.SliceStable(statList, func(i, j int) bool {
|
sort.SliceStable(records, func(i, j int) bool {
|
||||||
return statList[i].Count > statList[j].Count
|
return records[i].Count > records[j].Count
|
||||||
})
|
})
|
||||||
|
|
||||||
for _, record := range statList {
|
w := bufio.NewWriter(f)
|
||||||
line := fmt.Sprintf("%s %d %sSEQSEQ%s\n", record.Host, record.Count, record.OriginalUA, record.MockedUA)
|
defer func() {
|
||||||
if _, err := f.WriteString(line); err != nil {
|
if err := w.Flush(); err != nil {
|
||||||
slog.Error("os.File.WriteString", slog.Any("error", err))
|
slog.Error("bufio.Writer.Flush", slog.Any("error", err))
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
for _, record := range records {
|
||||||
|
_, err := fmt.Fprintf(w, "%s %d %sSEQSEQ%s\n",
|
||||||
|
record.Host, record.Count, record.OriginalUA, record.MockedUA)
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("Dump fmt.Fprintf", slog.Any("error", err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user