Skip to content
This repository has been archived by the owner on Mar 21, 2023. It is now read-only.

Commit

Permalink
Reduce syscall for reading hsperfdata.
Browse files Browse the repository at this point in the history
  • Loading branch information
YaSuenag committed Jan 17, 2016
1 parent 1aad5e0 commit 1215256
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 33 deletions.
55 changes: 22 additions & 33 deletions hsperfdata/hsperfdata.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,12 +104,12 @@ func ReadPrologue(f *os.File) (PerfDataPrologue, error) {
return result, nil
}

func ReadEntryName(f *os.File, StartOfs int64, entry *PerfDataEntry) error {
f.Seek(StartOfs + int64(entry.NameOffset), os.SEEK_SET)
func ReadEntryName(reader *bytes.Reader, StartOfs int64, entry *PerfDataEntry) error {
reader.Seek(StartOfs + int64(entry.NameOffset), os.SEEK_SET)

NameLen := entry.DataOffset - entry.NameOffset
var buf []byte = make([]byte, NameLen)
n, err := f.Read(buf)
n, err := reader.Read(buf)
if err != nil {
return err
} else if n != int(NameLen) {
Expand All @@ -122,12 +122,12 @@ func ReadEntryName(f *os.File, StartOfs int64, entry *PerfDataEntry) error {
return nil
}

func ReadEntryValueAsString(f *os.File, StartOfs int64, entry *PerfDataEntry) error {
f.Seek(StartOfs + int64(entry.DataOffset), os.SEEK_SET)
func ReadEntryValueAsString(reader *bytes.Reader, StartOfs int64, entry *PerfDataEntry) error {
reader.Seek(StartOfs + int64(entry.DataOffset), os.SEEK_SET)

DataLen := entry.EntryLength - entry.DataOffset
var buf []byte = make([]byte, DataLen)
n, err := f.Read(buf)
n, err := reader.Read(buf)
if err != nil {
return err
} else if n != int(DataLen) {
Expand All @@ -140,18 +140,8 @@ func ReadEntryValueAsString(f *os.File, StartOfs int64, entry *PerfDataEntry) er
return nil
}

func ReadEntryValueAsLong(f *os.File, StartOfs int64, prologue PerfDataPrologue, entry *PerfDataEntry) error {
f.Seek(StartOfs + int64(entry.DataOffset), os.SEEK_SET)

var buf []byte = make([]byte, 8)
n, err := f.Read(buf)
if err != nil {
return err
} else if n != 8 {
return errors.New("Could not read entry value.")
}

reader := bytes.NewReader(buf)
func ReadEntryValueAsLong(reader *bytes.Reader, StartOfs int64, prologue PerfDataPrologue, entry *PerfDataEntry) error {
reader.Seek(StartOfs + int64(entry.DataOffset), os.SEEK_SET)

var order binary.ByteOrder
if prologue.ByteOrder == 0 {
Expand All @@ -166,7 +156,14 @@ func ReadEntryValueAsLong(f *os.File, StartOfs int64, prologue PerfDataPrologue,
}

func ReadPerfEntry(f *os.File, prologue PerfDataPrologue) ([]PerfDataEntry, error){
var buf []byte = make([]byte, 20)
fileinfo, err := f.Stat()
if err != nil {
return nil, err
}

var buf []byte = make([]byte, fileinfo.Size() - 32)
f.Read(buf)

var result []PerfDataEntry = make([]PerfDataEntry, prologue.NumEntries)

var order binary.ByteOrder
Expand All @@ -176,22 +173,14 @@ func ReadPerfEntry(f *os.File, prologue PerfDataPrologue) ([]PerfDataEntry, erro
order = binary.LittleEndian
}

reader := bytes.NewReader(buf)
var i int32
for i = 0; i < prologue.NumEntries; i++ {
StartOfs, err := f.Seek(0, os.SEEK_CUR)
StartOfs, err := reader.Seek(0, os.SEEK_CUR)
if err != nil {
return nil, err
}

n, err := f.Read(buf)
if err != nil {
return nil, err
} else if n != 20 {
return nil, errors.New("Could not read PerfDataEntry.")
}

reader := bytes.NewReader(buf)

binary.Read(reader, order, &result[i].EntryLength)
binary.Read(reader, order, &result[i].NameOffset)
binary.Read(reader, order, &result[i].VectorLength)
Expand All @@ -201,28 +190,28 @@ func ReadPerfEntry(f *os.File, prologue PerfDataPrologue) ([]PerfDataEntry, erro
binary.Read(reader, order, &result[i].DataVariability)
binary.Read(reader, order, &result[i].DataOffset)

err = ReadEntryName(f, StartOfs, &result[i])
err = ReadEntryName(reader, StartOfs, &result[i])
if err != nil {
return nil, err
}

if result[i].DataType == 'B' {
err := ReadEntryValueAsString(f, StartOfs, &result[i])
err := ReadEntryValueAsString(reader, StartOfs, &result[i])

if err != nil {
return nil, err
}

} else if result[i].DataType == 'J' {
err := ReadEntryValueAsLong(f, StartOfs, prologue, &result[i])
err := ReadEntryValueAsLong(reader, StartOfs, prologue, &result[i])

if err != nil {
return nil, err
}

}

f.Seek(StartOfs + int64(result[i].EntryLength), os.SEEK_SET)
reader.Seek(StartOfs + int64(result[i].EntryLength), os.SEEK_SET)
}

return result, nil
Expand Down
11 changes: 11 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ import (
"github.com/elastic/libbeat/beat"

hsbeat "github.com/YaSuenag/hsbeat/hsbeat"

//"runtime/pprof"
)


Expand All @@ -36,6 +38,15 @@ func main() {
log.Fatal(err)
}

/*
prof, err := os.Create("hsbeat.prof")
if err != nil {
log.Fatal(err)
}
pprof.StartCPUProfile(prof)
defer pprof.StopCPUProfile()
*/

hb :=&hsbeat.HSBeat{os.Args[1], time.Duration(interval), "", false}
b := beat.NewBeat("hsbeat", "0.1.0", hb)
b.CommandLineSetup()
Expand Down

0 comments on commit 1215256

Please sign in to comment.