feat: Small-Medium 시나리오 추가 (1KB × 1000회, AI Agent RPC 경량)

- types.go: ScenarioSmallMedium 상수 추가, switch 문으로 모든 시나리오 함수 확장
- screen_config.go: 시나리오 2-way 토글 → 3-way 순환, 숫자키 1/2/3 지원
- screen_about.go: About 화면에 Small-Medium 시나리오 설명 추가
- README.md: 파라미터 표 업데이트
This commit is contained in:
Hermes Agent
2026-05-07 02:53:43 +00:00
parent 8d44ae55a0
commit cb53f6c912
4 changed files with 35 additions and 14 deletions
+1 -1
View File
@@ -118,7 +118,7 @@ src/
| 파라미터 | 범위 | 단위/단계 | | 파라미터 | 범위 | 단위/단계 |
|---------|-----|----------| |---------|-----|----------|
| 시나리오 | Small-Many / Large-Few | 토글 | | 시나리오 | Small-Many / Small-Medium / Large-Few | 3-way 순환 (←/→, 1/2/3) |
| 링크 지연 (편도) | 0 500 | ms (10ms 단위) | | 링크 지연 (편도) | 0 500 | ms (10ms 단위) |
| 패킷 손실율 | 0.0 5.0 | % (0.5% 단위) | | 패킷 손실율 | 0.0 5.0 | % (0.5% 단위) |
| 대역폭 | 1, 5, 10, 25, 50, 100, 250, 500, 1000 | Mbps (이산) | | 대역폭 | 1, 5, 10, 25, 50, 100, 250, 500, 1000 | Mbps (이산) |
+3 -1
View File
@@ -42,7 +42,9 @@ func (a App) viewAbout() string {
rows = append(rows, sectionHeader("📦 워크로드 시나리오")) rows = append(rows, sectionHeader("📦 워크로드 시나리오"))
rows = append(rows, " ① "+selectedItemStyle.Render("Small-Many")+" — 1KB 메시지 × 10,000회 / 디바이스") rows = append(rows, " ① "+selectedItemStyle.Render("Small-Many")+" — 1KB 메시지 × 10,000회 / 디바이스")
rows = append(rows, " "+helpStyle.Render("AI Agent RPC 패턴: 격리된 에이전트 간 빈번한 단발성 호출")) rows = append(rows, " "+helpStyle.Render("AI Agent RPC 패턴: 격리된 에이전트 간 빈번한 단발성 호출"))
rows = append(rows, " ② "+selectedItemStyle.Render("Large-Few")+" — 1MB 메시지 × 50회 / 디바이스") rows = append(rows, " ② "+selectedItemStyle.Render("Small-Medium")+" — 1KB 메시지 × 1,000회 / 디바이스")
rows = append(rows, " "+helpStyle.Render("AI Agent RPC 경량: 연결 수립 비용과 RTT가 더 지배적인 환경"))
rows = append(rows, " ③ "+selectedItemStyle.Render("Large-Few")+" — 1MB 메시지 × 50회 / 디바이스")
rows = append(rows, " "+helpStyle.Render("IoT 이미지 전송: 해충 탐지 ROI, 센서 클립 등")) rows = append(rows, " "+helpStyle.Render("IoT 이미지 전송: 해충 탐지 ROI, 센서 클립 등"))
rows = append(rows, "") rows = append(rows, "")
+9 -4
View File
@@ -51,6 +51,8 @@ func (a App) updateConfig(m tea.KeyMsg) (App, tea.Cmd) {
case "1": case "1":
a.config.Scenario = ScenarioSmallMany a.config.Scenario = ScenarioSmallMany
case "2": case "2":
a.config.Scenario = ScenarioSmallMedium
case "3":
a.config.Scenario = ScenarioLargeFew a.config.Scenario = ScenarioLargeFew
} }
return a, nil return a, nil
@@ -59,10 +61,13 @@ func (a App) updateConfig(m tea.KeyMsg) (App, tea.Cmd) {
func (a *App) adjustParam(delta int) { func (a *App) adjustParam(delta int) {
switch a.configIdx { switch a.configIdx {
case pIdxScenario: case pIdxScenario:
// 토글 // 3-way 순환: small-many → small-medium → large-few → small-many
if a.config.Scenario == ScenarioSmallMany { switch a.config.Scenario {
case ScenarioSmallMany:
a.config.Scenario = ScenarioSmallMedium
case ScenarioSmallMedium:
a.config.Scenario = ScenarioLargeFew a.config.Scenario = ScenarioLargeFew
} else { case ScenarioLargeFew:
a.config.Scenario = ScenarioSmallMany a.config.Scenario = ScenarioSmallMany
} }
case pIdxDelay: case pIdxDelay:
@@ -141,7 +146,7 @@ func (a App) viewConfig() string {
rows = append(rows, a.paramRow(pIdxScenario, rows = append(rows, a.paramRow(pIdxScenario,
"시나리오", "시나리오",
a.config.ScenarioLabel(), a.config.ScenarioLabel(),
fmt.Sprintf("디바이스당 %dKB × %d 메시지 (총 목표 %d개/시스템)", fmt.Sprintf("[1/2/3] 디바이스당 %dKB × %d 메시지 (총 목표 %d개/시스템)",
a.config.MessageSizeKB(), a.config.MessageSizeKB(),
a.config.MessageCount(), a.config.MessageCount(),
a.config.MessageCount()*a.config.DeviceCount, a.config.MessageCount()*a.config.DeviceCount,
+22 -8
View File
@@ -6,8 +6,9 @@ import "time"
type Scenario string type Scenario string
const ( const (
ScenarioSmallMany Scenario = "small-many" // 1KB × 10000회 (AI Agent RPC) ScenarioSmallMany Scenario = "small-many" // 1KB × 10000회 (AI Agent RPC)
ScenarioLargeFew Scenario = "large-few" // 1MB × 50회 (IoT 이미지 전송) ScenarioSmallMedium Scenario = "small-medium" // 1KB × 1000회 (AI Agent RPC 경량)
ScenarioLargeFew Scenario = "large-few" // 1MB × 50회 (IoT 이미지 전송)
) )
// System 비교 대상 시스템 // System 비교 대상 시스템
@@ -45,26 +46,39 @@ func DefaultConfig() Config {
// MessageSizeKB 시나리오별 메시지 크기 // MessageSizeKB 시나리오별 메시지 크기
func (c Config) MessageSizeKB() int { func (c Config) MessageSizeKB() int {
if c.Scenario == ScenarioSmallMany { switch c.Scenario {
case ScenarioSmallMany, ScenarioSmallMedium:
return 1 return 1
case ScenarioLargeFew:
return 1024
} }
return 1024 return 1
} }
// MessageCount 시나리오별 디바이스당 메시지 개수 // MessageCount 시나리오별 디바이스당 메시지 개수
func (c Config) MessageCount() int { func (c Config) MessageCount() int {
if c.Scenario == ScenarioSmallMany { switch c.Scenario {
case ScenarioSmallMany:
return 10000 return 10000
case ScenarioSmallMedium:
return 1000
case ScenarioLargeFew:
return 50
} }
return 50 return 1000
} }
// ScenarioLabel 표시용 시나리오 이름 // ScenarioLabel 표시용 시나리오 이름
func (c Config) ScenarioLabel() string { func (c Config) ScenarioLabel() string {
if c.Scenario == ScenarioSmallMany { switch c.Scenario {
case ScenarioSmallMany:
return "Small-Many · 1KB × 10000회 (AI Agent RPC)" return "Small-Many · 1KB × 10000회 (AI Agent RPC)"
case ScenarioSmallMedium:
return "Small-Medium · 1KB × 1000회 (AI Agent RPC 경량)"
case ScenarioLargeFew:
return "Large-Few · 1MB × 50회 (IoT 이미지 전송)"
} }
return "Large-Few · 1MB × 50회 (IoT 이미지 전송)" return string(c.Scenario)
} }
// HasSelectedSystem 최소 한 개 시스템 선택 여부 // HasSelectedSystem 최소 한 개 시스템 선택 여부