Skip to content

Commit ee435b7

Browse files
committed
Add --startGraphNodes and --chunkSize to Benchmarks.kt
1 parent b5307ef commit ee435b7

3 files changed

Lines changed: 181 additions & 108 deletions

File tree

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ plugins {
66

77
group = "vadyushkins"
88

9-
version = "1.0.8"
9+
version = "1.1.0"
1010

1111
repositories { mavenCentral() }
1212

src/main/kotlin/org/kotgll/benchmarks/Benchmarks.kt

Lines changed: 163 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import kotlinx.cli.default
66
import kotlinx.cli.required
77
import org.kotgll.cfg.grammar.readCFGFromTXT
88
import org.kotgll.graph.readGraphFromCSV
9+
import org.kotgll.graph.readStartNodesFromCSV
910
import org.kotgll.rsm.grammar.readRSMFromTXT
1011
import java.io.File
1112
import kotlin.system.measureNanoTime
@@ -43,11 +44,18 @@ fun main(args: Array<String>) {
4344
parser
4445
.option(ArgType.Choice<SPPFMode>(), fullName = "sppf", description = "Sppf mode")
4546
.default(SPPFMode.ON)
46-
val pathToInput by
47+
val pathToGraphs by
4748
parser
4849
.option(
49-
ArgType.String, fullName = "inputPath", description = "Path to folder with graphs")
50+
ArgType.String, fullName = "graphsPath", description = "Path to folder with graphs")
5051
.required()
52+
val pathToStartNodes by
53+
parser
54+
.option(
55+
ArgType.String,
56+
fullName = "startNodesPath",
57+
description = "Path to folder with start nodes for each graph")
58+
.default("")
5159
val pathToGrammar by
5260
parser
5361
.option(
@@ -67,30 +75,46 @@ fun main(args: Array<String>) {
6775
.option(
6876
ArgType.Int, fullName = "benchmarkRounds", description = "Number of benchmark rounds")
6977
.default(10)
78+
val chunkSize by
79+
parser
80+
.option(ArgType.Int, fullName = "chunkSize", description = "Start nodes chunk size")
81+
.default(10)
7082

7183
parser.parse(args)
7284

7385
if (grammarMode == GrammarMode.CFG) {
7486
if (sppfMode == SPPFMode.ON) {
75-
runCFGWithSPPF(pathToInput, pathToGrammar, pathToOutput, warmUpRounds, benchmarksRounds)
87+
runCFGWithSPPF(pathToGraphs,
88+
pathToStartNodes, pathToGrammar, pathToOutput, warmUpRounds, benchmarksRounds, chunkSize)
7689
} else if (sppfMode == SPPFMode.OFF) {
77-
runCFGWithoutSPPF(pathToInput, pathToGrammar, pathToOutput, warmUpRounds, benchmarksRounds)
90+
runCFGWithoutSPPF(
91+
pathToGraphs,
92+
pathToStartNodes,
93+
pathToGrammar,
94+
pathToOutput,
95+
warmUpRounds,
96+
benchmarksRounds,
97+
chunkSize)
7898
}
7999
} else if (grammarMode == GrammarMode.RSM) {
80100
if (sppfMode == SPPFMode.ON) {
81-
runRSMWithSPPF(pathToInput, pathToGrammar, pathToOutput, warmUpRounds, benchmarksRounds)
101+
runRSMWithSPPF(pathToGraphs,
102+
pathToStartNodes, pathToGrammar, pathToOutput, warmUpRounds, benchmarksRounds, chunkSize)
82103
} else if (sppfMode == SPPFMode.OFF) {
83-
runRSMWithoutSPPF(pathToInput, pathToGrammar, pathToOutput, warmUpRounds, benchmarksRounds)
104+
runRSMWithoutSPPF(pathToGraphs, pathToStartNodes, pathToGrammar, pathToOutput, warmUpRounds, benchmarksRounds,
105+
chunkSize)
84106
}
85107
}
86108
}
87109

88110
fun runCFGWithoutSPPF(
89111
pathToGraphs: String,
112+
pathToStartNodes: String,
90113
pathToCFG: String,
91114
pathToOutput: String,
92115
warmUpRounds: Int,
93-
benchmarkRounds: Int
116+
benchmarkRounds: Int,
117+
chunkSize: Int
94118
) {
95119
val cfg = readCFGFromTXT(pathToCFG)
96120
val cfgName = File(pathToCFG).nameWithoutExtension
@@ -101,45 +125,58 @@ fun runCFGWithoutSPPF(
101125
val graphName = graphPath.nameWithoutExtension
102126
println("start:: $graphName")
103127
val graph = readGraphFromCSV(graphPath.path)
128+
val startNodes = readStartNodesFromCSV("$pathToStartNodes/$graphName.csv")
104129

105-
val resultPath = getResultPath(pathToOutput, graphName, "cfg", cfgName, "without_sppf")
106-
File(resultPath).writeText("")
130+
for (chunkStart in 0..<startNodes.size step chunkSize) {
131+
val chunkEnd = kotlin.math.min(chunkStart + chunkSize, startNodes.size)
107132

108-
for (warmUp in 1..warmUpRounds) {
109-
var result: HashMap<Int, HashSet<Int>>
110-
val elapsed = measureNanoTime {
111-
result = org.kotgll.cfg.graphinput.withoutsppf.GLL(cfg, graph).parse()
112-
}
113-
val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
133+
val resultPath = getResultPath(pathToOutput, graphName, "cfg", cfgName, "without_sppf")
134+
File(resultPath).writeText("")
114135

115-
var number = 0
116-
result.keys.forEach { key -> number += result[key]!!.size }
136+
for (warmUp in 1..warmUpRounds) {
137+
var result: HashMap<Int, HashSet<Int>>
138+
val elapsed = measureNanoTime {
139+
result =
140+
org.kotgll.cfg.graphinput.withoutsppf
141+
.GLL(cfg, graph.subList(chunkStart, chunkEnd))
142+
.parse()
143+
}
144+
val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
117145

118-
println("warmup:: $graphName $cfgName ${number} $elapsedSeconds")
119-
}
146+
var number = 0
147+
result.keys.forEach { key -> number += result[key]!!.size }
120148

121-
for (benchmarkAttempt in 1..benchmarkRounds) {
122-
var result: HashMap<Int, HashSet<Int>>
123-
val elapsed = measureNanoTime {
124-
result = org.kotgll.cfg.graphinput.withoutsppf.GLL(cfg, graph).parse()
149+
println("warmup:: $graphName $cfgName ${number} $elapsedSeconds")
125150
}
126-
val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
127151

128-
var number = 0
129-
result.keys.forEach { key -> number += result[key]!!.size }
130-
131-
println("benchmark:: $graphName $cfgName ${number} $elapsedSeconds")
132-
File(resultPath).appendText(elapsed.toString() + "\n")
152+
for (benchmarkAttempt in 1..benchmarkRounds) {
153+
var result: HashMap<Int, HashSet<Int>>
154+
val elapsed = measureNanoTime {
155+
result =
156+
org.kotgll.cfg.graphinput.withoutsppf
157+
.GLL(cfg, graph.subList(chunkStart, chunkEnd))
158+
.parse()
159+
}
160+
val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
161+
162+
var number = 0
163+
result.keys.forEach { key -> number += result[key]!!.size }
164+
165+
println("benchmark:: $graphName $cfgName ${number} $elapsedSeconds")
166+
File(resultPath).appendText(elapsed.toString() + "\n")
167+
}
133168
}
134169
}
135170
}
136171

137172
fun runCFGWithSPPF(
138-
pathToGraphs: String,
139-
pathToCFG: String,
140-
pathToOutput: String,
141-
warmUpRounds: Int,
142-
benchmarkRounds: Int
173+
pathToGraphs: String,
174+
pathToStartNodes: String,
175+
pathToCFG: String,
176+
pathToOutput: String,
177+
warmUpRounds: Int,
178+
benchmarkRounds: Int,
179+
chunkSize: Int
143180
) {
144181
val cfg = readCFGFromTXT(pathToCFG)
145182
val cfgName = File(pathToCFG).nameWithoutExtension
@@ -150,45 +187,52 @@ fun runCFGWithSPPF(
150187
val graphName = graphPath.nameWithoutExtension
151188
println("start:: $graphName")
152189
val graph = readGraphFromCSV(graphPath.path)
190+
val startNodes = readStartNodesFromCSV("$pathToStartNodes/$graphName.csv")
153191

154-
val resultPath = getResultPath(pathToOutput, graphName, "cfg", cfgName, "with_sppf")
155-
File(resultPath).writeText("")
192+
for (chunkStart in 0..<startNodes.size step chunkSize) {
193+
val chunkEnd = kotlin.math.min(chunkStart + chunkSize, startNodes.size)
156194

157-
for (warmUp in 1..warmUpRounds) {
158-
var result: HashMap<Int, HashMap<Int, org.kotgll.cfg.graphinput.withsppf.sppf.SPPFNode>>
159-
val elapsed = measureNanoTime {
160-
result = org.kotgll.cfg.graphinput.withsppf.GLL(cfg, graph).parse()
161-
}
162-
val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
195+
val resultPath = getResultPath(pathToOutput, graphName, "cfg", cfgName, "with_sppf")
196+
File(resultPath).writeText("")
163197

164-
var number = 0
165-
result.keys.forEach { key -> number += result[key]!!.keys.size }
198+
for (warmUp in 1..warmUpRounds) {
199+
var result: HashMap<Int, HashMap<Int, org.kotgll.cfg.graphinput.withsppf.sppf.SPPFNode>>
200+
val elapsed = measureNanoTime {
201+
result = org.kotgll.cfg.graphinput.withsppf.GLL(cfg, graph.subList(chunkStart, chunkEnd)).parse()
202+
}
203+
val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
166204

167-
println("warmup:: $graphName $cfgName ${number} $elapsedSeconds")
168-
}
205+
var number = 0
206+
result.keys.forEach { key -> number += result[key]!!.keys.size }
169207

170-
for (benchmarkAttempt in 1..benchmarkRounds) {
171-
var result: HashMap<Int, HashMap<Int, org.kotgll.cfg.graphinput.withsppf.sppf.SPPFNode>>
172-
val elapsed = measureNanoTime {
173-
result = org.kotgll.cfg.graphinput.withsppf.GLL(cfg, graph).parse()
174-
}
175-
val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
208+
println("warmup:: $graphName $cfgName ${number} $elapsedSeconds")
209+
}
176210

177-
var number = 0
178-
result.keys.forEach { key -> number += result[key]!!.keys.size }
211+
for (benchmarkAttempt in 1..benchmarkRounds) {
212+
var result: HashMap<Int, HashMap<Int, org.kotgll.cfg.graphinput.withsppf.sppf.SPPFNode>>
213+
val elapsed = measureNanoTime {
214+
result = org.kotgll.cfg.graphinput.withsppf.GLL(cfg, graph.subList(chunkStart, chunkEnd)).parse()
215+
}
216+
val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
179217

180-
println("benchmark:: $graphName $cfgName ${number} $elapsedSeconds")
181-
File(resultPath).appendText(elapsed.toString() + "\n")
182-
}
218+
var number = 0
219+
result.keys.forEach { key -> number += result[key]!!.keys.size }
220+
221+
println("benchmark:: $graphName $cfgName ${number} $elapsedSeconds")
222+
File(resultPath).appendText(elapsed.toString() + "\n")
223+
}
224+
}
183225
}
184226
}
185227

186228
fun runRSMWithoutSPPF(
187229
pathToGraphs: String,
230+
pathToStartNodes: String,
188231
pathToRSM: String,
189232
pathToOutput: String,
190233
warmUpRounds: Int,
191-
benchmarkRounds: Int
234+
benchmarkRounds: Int,
235+
chunkSize: Int,
192236
) {
193237
val rsm = readRSMFromTXT(pathToRSM)
194238
val rsmName = File(pathToRSM).nameWithoutExtension
@@ -199,45 +243,52 @@ fun runRSMWithoutSPPF(
199243
val graphName = graphPath.nameWithoutExtension
200244
println("start:: $graphName")
201245
val graph = readGraphFromCSV(graphPath.path)
246+
val startNodes = readStartNodesFromCSV("$pathToStartNodes/$graphName.csv")
202247

203-
val resultPath = getResultPath(pathToOutput, graphName, "rsm", rsmName, "without_sppf")
204-
File(resultPath).writeText("")
248+
for (chunkStart in 0..<startNodes.size step chunkSize) {
249+
val chunkEnd = kotlin.math.min(chunkStart + chunkSize, startNodes.size)
205250

206-
for (warmUp in 1..warmUpRounds) {
207-
var result: HashMap<Int, HashSet<Int>>
208-
val elapsed = measureNanoTime {
209-
result = org.kotgll.rsm.graphinput.withoutsppf.GLL(rsm, graph).parse()
210-
}
211-
val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
251+
val resultPath = getResultPath(pathToOutput, graphName, "rsm", rsmName, "without_sppf")
252+
File(resultPath).writeText("")
212253

213-
var number = 0
214-
result.keys.forEach { key -> number += result[key]!!.size }
254+
for (warmUp in 1..warmUpRounds) {
255+
var result: HashMap<Int, HashSet<Int>>
256+
val elapsed = measureNanoTime {
257+
result = org.kotgll.rsm.graphinput.withoutsppf.GLL(rsm, graph.subList(chunkStart, chunkEnd)).parse()
258+
}
259+
val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
215260

216-
println("warmup:: $graphName $rsmName ${number} $elapsedSeconds")
217-
}
261+
var number = 0
262+
result.keys.forEach { key -> number += result[key]!!.size }
218263

219-
for (benchmarkAttempt in 1..benchmarkRounds) {
220-
var result: HashMap<Int, HashSet<Int>>
221-
val elapsed = measureNanoTime {
222-
result = org.kotgll.rsm.graphinput.withoutsppf.GLL(rsm, graph).parse()
264+
println("warmup:: $graphName $rsmName ${number} $elapsedSeconds")
223265
}
224-
val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
225266

226-
var number = 0
227-
result.keys.forEach { key -> number += result[key]!!.size }
267+
for (benchmarkAttempt in 1..benchmarkRounds) {
268+
var result: HashMap<Int, HashSet<Int>>
269+
val elapsed = measureNanoTime {
270+
result = org.kotgll.rsm.graphinput.withoutsppf.GLL(rsm, graph.subList(chunkStart, chunkEnd)).parse()
271+
}
272+
val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
228273

229-
println("benchmark:: $graphName $rsmName ${number} $elapsedSeconds")
230-
File(resultPath).appendText(elapsed.toString() + "\n")
274+
var number = 0
275+
result.keys.forEach { key -> number += result[key]!!.size }
276+
277+
println("benchmark:: $graphName $rsmName ${number} $elapsedSeconds")
278+
File(resultPath).appendText(elapsed.toString() + "\n")
279+
}
231280
}
232281
}
233282
}
234283

235284
fun runRSMWithSPPF(
236-
pathToGraphs: String,
237-
pathToRSM: String,
238-
pathToOutput: String,
239-
warmUpRounds: Int,
240-
benchmarkRounds: Int
285+
pathToGraphs: String,
286+
pathToStartNodes: String,
287+
pathToRSM: String,
288+
pathToOutput: String,
289+
warmUpRounds: Int,
290+
benchmarkRounds: Int,
291+
chunkSize: Int,
241292
) {
242293
val rsm = readRSMFromTXT(pathToRSM)
243294
val rsmName = File(pathToRSM).nameWithoutExtension
@@ -248,35 +299,40 @@ fun runRSMWithSPPF(
248299
val graphName = graphPath.nameWithoutExtension
249300
println("start:: $graphName")
250301
val graph = readGraphFromCSV(graphPath.path)
302+
val startNodes = readStartNodesFromCSV("$pathToStartNodes/$graphName.csv")
251303

252-
val resultPath = getResultPath(pathToOutput, graphName, "rsm", rsmName, "with_sppf")
253-
File(resultPath).writeText("")
304+
for (chunkStart in 0..<startNodes.size step chunkSize) {
305+
val chunkEnd = kotlin.math.min(chunkStart + chunkSize, startNodes.size)
254306

255-
for (warmUp in 1..warmUpRounds) {
256-
var result: HashMap<Int, HashMap<Int, org.kotgll.rsm.graphinput.withsppf.sppf.SPPFNode>>
257-
val elapsed = measureNanoTime {
258-
result = org.kotgll.rsm.graphinput.withsppf.GLL(rsm, graph).parse()
259-
}
260-
val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
307+
val resultPath = getResultPath(pathToOutput, graphName, "rsm", rsmName, "with_sppf")
308+
File(resultPath).writeText("")
261309

262-
var number = 0
263-
result.keys.forEach { key -> number += result[key]!!.keys.size }
310+
for (warmUp in 1..warmUpRounds) {
311+
var result: HashMap<Int, HashMap<Int, org.kotgll.rsm.graphinput.withsppf.sppf.SPPFNode>>
312+
val elapsed = measureNanoTime {
313+
result = org.kotgll.rsm.graphinput.withsppf.GLL(rsm, graph.subList(chunkStart, chunkEnd)).parse()
314+
}
315+
val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
264316

265-
println("warmup:: $graphName $rsmName ${number} $elapsedSeconds")
266-
}
317+
var number = 0
318+
result.keys.forEach { key -> number += result[key]!!.keys.size }
267319

268-
for (benchmarkAttempt in 1..benchmarkRounds) {
269-
var result: HashMap<Int, HashMap<Int, org.kotgll.rsm.graphinput.withsppf.sppf.SPPFNode>>
270-
val elapsed = measureNanoTime {
271-
result = org.kotgll.rsm.graphinput.withsppf.GLL(rsm, graph).parse()
272-
}
273-
val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
320+
println("warmup:: $graphName $rsmName ${number} $elapsedSeconds")
321+
}
274322

275-
var number = 0
276-
result.keys.forEach { key -> number += result[key]!!.keys.size }
323+
for (benchmarkAttempt in 1..benchmarkRounds) {
324+
var result: HashMap<Int, HashMap<Int, org.kotgll.rsm.graphinput.withsppf.sppf.SPPFNode>>
325+
val elapsed = measureNanoTime {
326+
result = org.kotgll.rsm.graphinput.withsppf.GLL(rsm, graph.subList(chunkStart, chunkEnd)).parse()
327+
}
328+
val elapsedSeconds = elapsed.toDouble() / 1_000_000_000.0
277329

278-
println("benchmark:: $graphName $rsmName ${number} $elapsedSeconds")
279-
File(resultPath).appendText(elapsed.toString() + "\n")
280-
}
330+
var number = 0
331+
result.keys.forEach { key -> number += result[key]!!.keys.size }
332+
333+
println("benchmark:: $graphName $rsmName ${number} $elapsedSeconds")
334+
File(resultPath).appendText(elapsed.toString() + "\n")
335+
}
336+
}
281337
}
282338
}

0 commit comments

Comments
 (0)