mirror of
https://github.com/aziascreations/PB-MessagePack.git
synced 2026-11-03 17:01:24 +01:00
9facb66ee8
Co-Authored-By: Claude <noreply@anthropic.com>
173 lines
4.4 KiB
Plaintext
173 lines
4.4 KiB
Plaintext
EnableExplicit
|
|
|
|
XIncludeFile "../../Includes/MessagePack.pbi"
|
|
XIncludeFile "../_PerfTesting.pbi"
|
|
|
|
|
|
; Builds and reads arrays nested `NestedDepth` levels deep, each one holding 3 integers before the next one.
|
|
; Each run handles `NestedRepeats` of them, and `NsPerOp` is the time per nested structure.
|
|
; The depth goes up to the default `#MsgPack_MaxDepth`.
|
|
|
|
#NestedMaxDepth = 128
|
|
|
|
; Number of levels handled by each run, split between the repeats.
|
|
#NestedLevelsPerRun = 100000
|
|
|
|
Global NestedDepth.i
|
|
Global NestedRepeats.i
|
|
Global *NestedBuffer
|
|
|
|
|
|
Procedure WriteLevelIntegers(*Writer)
|
|
PerfCheckWrite(MsgPackWriteInteger(*Writer, 1))
|
|
PerfCheckWrite(MsgPackWriteInteger(*Writer, 2))
|
|
PerfCheckWrite(MsgPackWriteInteger(*Writer, 3))
|
|
EndProcedure
|
|
|
|
; Returns the finalized buffer, which must be freed with `FreeMemory()`.
|
|
; Each level's content is written in its own writer, then copied into its parent.
|
|
Procedure.i BuildNestedBuffer()
|
|
Protected *Content, *Parent, *Buffer
|
|
Protected Level.i
|
|
|
|
*Content = MsgPackCreate(64)
|
|
If Not *Content
|
|
PerfFail("Failed to create a writer !")
|
|
EndIf
|
|
WriteLevelIntegers(*Content)
|
|
|
|
For Level = 2 To NestedDepth
|
|
*Parent = MsgPackCreate(64)
|
|
If Not *Parent
|
|
PerfFail("Failed to create a writer !")
|
|
EndIf
|
|
WriteLevelIntegers(*Parent)
|
|
PerfCheckWrite(MsgPackWriteArrayFrom(*Parent, *Content))
|
|
MsgPackFree(*Content, #True)
|
|
*Content = *Parent
|
|
Next
|
|
|
|
; The top-level array.
|
|
*Parent = MsgPackCreate(64)
|
|
If Not *Parent
|
|
PerfFail("Failed to create a writer !")
|
|
EndIf
|
|
PerfCheckWrite(MsgPackWriteArrayFrom(*Parent, *Content))
|
|
MsgPackFree(*Content, #True)
|
|
|
|
*Buffer = MsgPackFinalize(*Parent)
|
|
If Not *Buffer
|
|
PerfFail("Failed to finalize the writer !")
|
|
EndIf
|
|
|
|
ProcedureReturn *Buffer
|
|
EndProcedure
|
|
|
|
; Examines every level, reading its integers, and returns their sum for one structure.
|
|
Procedure.q ExamineNested(ExaminationOptions.MsgPack_ExaminationOption)
|
|
Protected Dim Views.i(NestedDepth)
|
|
Protected Total.q
|
|
Protected Iteration.i, Level.i, Entry.i
|
|
|
|
For Iteration = 1 To NestedRepeats
|
|
Total = 0
|
|
|
|
Views(0) = MsgPackWrapMsgBuffer(*NestedBuffer, MemorySize(*NestedBuffer))
|
|
If Not Views(0)
|
|
PerfFail("Failed to wrap the buffer !")
|
|
EndIf
|
|
|
|
For Level = 1 To NestedDepth
|
|
Views(Level) = MsgPackExamine(Views(Level - 1), ExaminationOptions)
|
|
If Not Views(Level)
|
|
PerfFail("Failed to examine level " + Str(Level) + " !")
|
|
EndIf
|
|
|
|
For Entry = 1 To 3
|
|
If Not MsgPackNextEntry(Views(Level))
|
|
PerfFail("Missing integer at level " + Str(Level) + " !")
|
|
EndIf
|
|
Total + MsgPackReadInteger(Views(Level))
|
|
Next
|
|
|
|
; Moving to the nested array, the innermost level doesn't have one.
|
|
If Level < NestedDepth
|
|
If Not MsgPackNextEntry(Views(Level))
|
|
PerfFail("Missing array at level " + Str(Level) + " !")
|
|
EndIf
|
|
EndIf
|
|
Next
|
|
|
|
For Level = NestedDepth To 1 Step -1
|
|
MsgPackFinish(Views(Level))
|
|
Next
|
|
MsgPackFree(Views(0), #False)
|
|
Next
|
|
|
|
ProcedureReturn Total
|
|
EndProcedure
|
|
|
|
|
|
Procedure.q ScenarioBuild()
|
|
Protected *Buffer
|
|
Protected Size.q
|
|
Protected Iteration.i
|
|
|
|
For Iteration = 1 To NestedRepeats
|
|
*Buffer = BuildNestedBuffer()
|
|
Size = MemorySize(*Buffer)
|
|
FreeMemory(*Buffer)
|
|
Next
|
|
|
|
ProcedureReturn Size
|
|
EndProcedure
|
|
|
|
Procedure.q ScenarioExamine()
|
|
ProcedureReturn ExamineNested(0)
|
|
EndProcedure
|
|
|
|
Procedure.q ScenarioExamineUnsafe()
|
|
ProcedureReturn ExamineNested(#MsgPack_ExaminationOptions_Unsafe)
|
|
EndProcedure
|
|
|
|
Procedure.q ScenarioFullSize()
|
|
Protected *Reader
|
|
Protected Size.q
|
|
Protected Iteration.i
|
|
|
|
For Iteration = 1 To NestedRepeats
|
|
*Reader = MsgPackWrapMsgBuffer(*NestedBuffer, MemorySize(*NestedBuffer))
|
|
If Not *Reader
|
|
PerfFail("Failed to wrap the buffer !")
|
|
EndIf
|
|
|
|
Size = MsgPackGetFieldFullSize(*Reader)
|
|
If Size = #MsgPack_InvalidSize
|
|
PerfFail("Failed to get the full size !")
|
|
EndIf
|
|
|
|
MsgPackFree(*Reader, #False)
|
|
Next
|
|
|
|
ProcedureReturn Size
|
|
EndProcedure
|
|
|
|
|
|
OpenConsole()
|
|
|
|
NestedDepth = 1
|
|
While NestedDepth <= #NestedMaxDepth
|
|
NestedRepeats = #NestedLevelsPerRun / NestedDepth
|
|
*NestedBuffer = BuildNestedBuffer()
|
|
|
|
PerfRun("pb", "nested-" + Str(NestedDepth) + "-build", @ScenarioBuild(), NestedRepeats)
|
|
PerfRun("pb", "nested-" + Str(NestedDepth) + "-examine", @ScenarioExamine(), NestedRepeats)
|
|
PerfRun("pb", "nested-" + Str(NestedDepth) + "-examine-unsafe", @ScenarioExamineUnsafe(), NestedRepeats)
|
|
PerfRun("pb", "nested-" + Str(NestedDepth) + "-fullsize", @ScenarioFullSize(), NestedRepeats)
|
|
|
|
FreeMemory(*NestedBuffer)
|
|
NestedDepth * 2
|
|
Wend
|
|
|
|
End 0
|