diff --git a/internal/state/manager.go b/internal/state/manager.go index b80ec54..5734632 100644 --- a/internal/state/manager.go +++ b/internal/state/manager.go @@ -204,9 +204,11 @@ func (m *Manager) Get(ip string) (*Device, bool) { func (m *Manager) GetAll() []Device { m.mu.RLock() defer m.mu.RUnlock() - result := make([]Device, 0, len(m.devices)) + result := make([]Device, len(m.devices)) + i := 0 for _, dev := range m.devices { - result = append(result, *dev) + result[i] = *dev + i++ } return result } @@ -245,9 +247,11 @@ func (m *Manager) UpdateDeviceSNMP(ip, hostname, sysDescr string) { func (m *Manager) GetAllIPs() []string { m.mu.RLock() defer m.mu.RUnlock() - ips := make([]string, 0, len(m.devices)) + ips := make([]string, len(m.devices)) + i := 0 for ip := range m.devices { - ips = append(ips, ip) + ips[i] = ip + i++ } return ips } diff --git a/internal/state/manager_bench_test.go b/internal/state/manager_bench_test.go index 124543f..bd7fd4e 100644 --- a/internal/state/manager_bench_test.go +++ b/internal/state/manager_bench_test.go @@ -419,3 +419,34 @@ func BenchmarkConcurrentMixed(b *testing.B) { }) } } + +// BenchmarkGetAll tests the performance of retrieving all devices +func BenchmarkGetAll(b *testing.B) { + benchmarks := []struct { + name string + deviceCount int + }{ + {"GetAll_100devices", 100}, + {"GetAll_1Kdevices", 1000}, + {"GetAll_10Kdevices", 10000}, + {"GetAll_20Kdevices", 20000}, + } + + for _, bm := range benchmarks { + b.Run(bm.name, func(b *testing.B) { + mgr := NewManager(bm.deviceCount * 2) + + // Populate with devices + for i := 0; i < bm.deviceCount; i++ { + ip := fmt.Sprintf("192.168.%d.%d", i/256, i%256) + mgr.AddDevice(ip) + } + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _ = mgr.GetAll() + } + }) + } +}