Skip to content

Commit 822b0ca

Browse files
Merge pull request #92 from AlexsanderHamir/refactors
Refactors
2 parents 8f06c7c + 7f85f37 commit 822b0ca

File tree

3 files changed

+138
-134
lines changed

3 files changed

+138
-134
lines changed

parser/apiv2.go

Lines changed: 1 addition & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,9 @@
11
package parser
22

33
import (
4-
"fmt"
5-
"sort"
6-
"strings"
7-
84
"github.com/AlexsanderHamir/prof/internal"
95
)
106

11-
type LineObj struct {
12-
FnName string
13-
Flat float64
14-
FlatPercentage float64
15-
SumPercentage float64
16-
Cum float64
17-
CumPercentage float64
18-
}
19-
207
// TurnLinesIntoObjectsV2 turn profile data from a .pprof file into line objects.
218
func TurnLinesIntoObjectsV2(profilePath string) ([]*LineObj, error) {
229
profileData, err := extractProfileData(profilePath)
@@ -129,6 +116,7 @@ func OrganizeProfileByPackageV2(profilePath string, filter internal.FunctionFilt
129116
FlatPercentage: profileData.FlatPercentages[fn],
130117
Cum: float64(profileData.Cum[fn]),
131118
CumPercentage: profileData.CumPercentages[fn],
119+
SumPercentage: profileData.SumPercentages[fn],
132120
}
133121

134122
packageGroups[packageName].Functions = append(packageGroups[packageName].Functions, funcInfo)
@@ -149,124 +137,3 @@ func OrganizeProfileByPackageV2(profilePath string, filter internal.FunctionFilt
149137
// Generate formatted output
150138
return formatPackageReport(sortedPackages), nil
151139
}
152-
153-
// PackageGroup represents a group of functions from the same package
154-
type PackageGroup struct {
155-
Name string
156-
Functions []*FunctionInfo
157-
TotalFlat float64
158-
TotalCum float64
159-
FlatPercentage float64
160-
CumPercentage float64
161-
}
162-
163-
// FunctionInfo represents a function with its performance metrics
164-
type FunctionInfo struct {
165-
Name string
166-
FullName string
167-
Flat float64
168-
FlatPercentage float64
169-
Cum float64
170-
CumPercentage float64
171-
}
172-
173-
// extractPackageName extracts the package name from a full function path
174-
func extractPackageName(fullPath string) string {
175-
// Handle cases like "github.com/user/pkg.(*Type).Method" => "github.com/user/pkg"
176-
// or "sync/atomic.CompareAndSwapPointer" => "sync/atomic"
177-
178-
// Split by dots
179-
parts := strings.Split(fullPath, ".")
180-
if len(parts) < 2 {
181-
return ""
182-
}
183-
184-
// Check if it's a standard library package (like "sync/atomic")
185-
if !strings.Contains(parts[0], "/") && len(parts) >= 2 {
186-
// Standard library package
187-
if len(parts) >= 3 && strings.Contains(parts[1], "/") {
188-
return parts[0] + "." + parts[1]
189-
}
190-
return parts[0]
191-
}
192-
193-
// Check if it's a GitHub-style package
194-
if strings.Contains(parts[0], "github.com") || strings.Contains(parts[0], "golang.org") {
195-
// For GitHub packages, take up to the third part (github.com/user/pkg)
196-
if len(parts) >= 3 {
197-
return strings.Join(parts[:3], ".")
198-
}
199-
return strings.Join(parts[:2], ".")
200-
}
201-
202-
// For other cases, take the first part
203-
return parts[0]
204-
}
205-
206-
// sortPackagesByFlatPercentage sorts packages by their flat percentage in descending order
207-
func sortPackagesByFlatPercentage(packageGroups map[string]*PackageGroup) []*PackageGroup {
208-
var packages []*PackageGroup
209-
for _, pkg := range packageGroups {
210-
packages = append(packages, pkg)
211-
}
212-
213-
sort.Slice(packages, func(i, j int) bool {
214-
return packages[i].FlatPercentage > packages[j].FlatPercentage
215-
})
216-
217-
return packages
218-
}
219-
220-
// formatPackageReport formats the package groups into a readable report
221-
func formatPackageReport(packages []*PackageGroup) string {
222-
var result strings.Builder
223-
224-
for i, pkg := range packages {
225-
if i > 0 {
226-
result.WriteString("\n\n")
227-
}
228-
229-
// Package header
230-
result.WriteString(fmt.Sprintf("#### **%s**\n", pkg.Name))
231-
232-
// Sort functions by flat percentage (descending)
233-
sort.Slice(pkg.Functions, func(i, j int) bool {
234-
return pkg.Functions[i].FlatPercentage > pkg.Functions[j].FlatPercentage
235-
})
236-
237-
// List functions
238-
for _, fn := range pkg.Functions {
239-
if fn.Flat > 0 {
240-
// Show only function name and percentage
241-
result.WriteString(fmt.Sprintf("- `%s` → %.2f%%\n",
242-
fn.Name, fn.FlatPercentage))
243-
} else if fn.Cum > 0 {
244-
// Function with only cumulative time
245-
result.WriteString(fmt.Sprintf("- `%s` → 0%% (cum %.2f%%)\n",
246-
fn.Name, fn.CumPercentage))
247-
}
248-
}
249-
250-
// Package subtotal
251-
result.WriteString(fmt.Sprintf("\n**Subtotal (%s)**: ≈%.1f%%",
252-
extractShortPackageName(pkg.Name), pkg.FlatPercentage))
253-
}
254-
255-
return result.String()
256-
}
257-
258-
// extractShortPackageName extracts a shorter version of the package name for display
259-
func extractShortPackageName(fullPackageName string) string {
260-
parts := strings.Split(fullPackageName, ".")
261-
if len(parts) == 0 {
262-
return fullPackageName
263-
}
264-
265-
// For GitHub packages, show just the last part
266-
if strings.Contains(fullPackageName, "github.com") {
267-
return parts[len(parts)-1]
268-
}
269-
270-
// For standard library, show the full name
271-
return fullPackageName
272-
}

parser/helpersv2.go

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,3 +223,109 @@ func getFilterSets(ignoreFunctions []string) map[string]struct{} {
223223

224224
return ignoreSet
225225
}
226+
227+
// extractPackageName extracts the package name from a full function path
228+
func extractPackageName(fullPath string) string {
229+
// Handle cases like "github.com/user/pkg.(*Type).Method" => "github.com/user/pkg"
230+
// or "sync/atomic.CompareAndSwapPointer" => "sync/atomic"
231+
232+
// Split by dots
233+
parts := strings.Split(fullPath, ".")
234+
if len(parts) < 2 {
235+
return ""
236+
}
237+
238+
// Check if it's a standard library package (like "sync/atomic")
239+
if !strings.Contains(parts[0], "/") && len(parts) >= 2 {
240+
// Standard library package
241+
if len(parts) >= 3 && strings.Contains(parts[1], "/") {
242+
return parts[0] + "." + parts[1]
243+
}
244+
return parts[0]
245+
}
246+
247+
// Check if it's a GitHub-style package
248+
if strings.Contains(parts[0], "github.com") || strings.Contains(parts[0], "golang.org") {
249+
// For GitHub packages, take up to the third part (github.com/user/pkg)
250+
if len(parts) >= 3 {
251+
return strings.Join(parts[:3], ".")
252+
}
253+
return strings.Join(parts[:2], ".")
254+
}
255+
256+
// For other cases, take the first part
257+
return parts[0]
258+
}
259+
260+
// sortPackagesByFlatPercentage sorts packages by their flat percentage in descending order
261+
func sortPackagesByFlatPercentage(packageGroups map[string]*PackageGroup) []*PackageGroup {
262+
var packages []*PackageGroup
263+
for _, pkg := range packageGroups {
264+
packages = append(packages, pkg)
265+
}
266+
267+
sort.Slice(packages, func(i, j int) bool {
268+
return packages[i].FlatPercentage > packages[j].FlatPercentage
269+
})
270+
271+
return packages
272+
}
273+
274+
// formatFunctionOutput formats a single function's output based on package type
275+
func formatFunctionOutput(fn *FunctionInfo, isUnknownPackage bool) string {
276+
if isUnknownPackage {
277+
// For unknown package, show full prof-style output
278+
return fmt.Sprintf("- `%s` → flat: %.2f, flat%%: %.2f%%, sum%%: %.2f%%, cum: %.2f, cum%%: %.2f%%\n",
279+
fn.Name, fn.Flat, fn.FlatPercentage, fn.SumPercentage, fn.Cum, fn.CumPercentage)
280+
}
281+
282+
// For known packages, show simplified format
283+
return fmt.Sprintf("- `%s` → %.2f%%\n", fn.Name, fn.FlatPercentage)
284+
}
285+
286+
// formatPackageReport formats the package groups into a readable report
287+
func formatPackageReport(packages []*PackageGroup) string {
288+
var result strings.Builder
289+
290+
for i, pkg := range packages {
291+
if i > 0 {
292+
result.WriteString("\n\n")
293+
}
294+
295+
// Package header
296+
result.WriteString(fmt.Sprintf("#### **%s**\n", pkg.Name))
297+
298+
// Sort functions by flat percentage (descending)
299+
sort.Slice(pkg.Functions, func(i, j int) bool {
300+
return pkg.Functions[i].FlatPercentage > pkg.Functions[j].FlatPercentage
301+
})
302+
303+
// List functions
304+
isUnknownPackage := pkg.Name == "unknown"
305+
for _, fn := range pkg.Functions {
306+
result.WriteString(formatFunctionOutput(fn, isUnknownPackage))
307+
}
308+
309+
// Package subtotal
310+
result.WriteString(fmt.Sprintf("\n**Subtotal (%s)**: ≈%.1f%%",
311+
extractShortPackageName(pkg.Name), pkg.FlatPercentage))
312+
}
313+
314+
return result.String()
315+
}
316+
317+
// extractShortPackageName extracts a shorter version of the package name for display
318+
func extractShortPackageName(fullPackageName string) string {
319+
parts := strings.Split(fullPackageName, ".")
320+
if len(parts) == 0 {
321+
return fullPackageName
322+
}
323+
324+
// For GitHub packages, show just the last part
325+
if strings.Contains(fullPackageName, "github.com") {
326+
return parts[len(parts)-1]
327+
}
328+
329+
// For standard library, show the full name
330+
return fullPackageName
331+
}

parser/types.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package parser
2+
3+
type LineObj struct {
4+
FnName string
5+
Flat float64
6+
FlatPercentage float64
7+
SumPercentage float64
8+
Cum float64
9+
CumPercentage float64
10+
}
11+
12+
// PackageGroup represents a group of functions from the same package
13+
type PackageGroup struct {
14+
Name string
15+
Functions []*FunctionInfo
16+
TotalFlat float64
17+
TotalCum float64
18+
FlatPercentage float64
19+
CumPercentage float64
20+
}
21+
22+
// FunctionInfo represents a function with its performance metrics
23+
type FunctionInfo struct {
24+
Name string
25+
FullName string
26+
Flat float64
27+
FlatPercentage float64
28+
Cum float64
29+
CumPercentage float64
30+
SumPercentage float64
31+
}

0 commit comments

Comments
 (0)