Skip to content

Commit d5d45b1

Browse files
authored
[F#/Oxpecker] Improved json, fortunes and updates benchmarks (#9112)
* [F#/Oxpecker] Improved json and fortunes bencmarks * [F#/Oxpecker] Improved multi-update benchmark * [F#/Oxpecker] Refactoring
1 parent d4d4557 commit d5d45b1

File tree

1 file changed

+43
-35
lines changed

1 file changed

+43
-35
lines changed

frameworks/FSharp/oxpecker/src/App/Program.fs

Lines changed: 43 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,17 @@ open Oxpecker
77
[<AutoOpen>]
88
module Common =
99

10+
[<Struct>]
1011
[<CLIMutable>]
11-
type Fortune =
12-
{
13-
id : int
14-
message : string
15-
}
12+
type JsonMessage = {
13+
message : string
14+
}
15+
16+
[<CLIMutable>]
17+
type Fortune = {
18+
id: int
19+
message: string
20+
}
1621

1722
[<Literal>]
1823
let ConnectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=1024;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000"
@@ -43,13 +48,13 @@ module HtmlViews =
4348
th() { raw "message" }
4449
}
4550

46-
let fortunes (fortunes: Fortune[]) =
51+
let fortunes fortunesData =
4752
table() {
4853
fortunesTableHeader
49-
for f in fortunes do
54+
for fortune in fortunesData do
5055
tr() {
51-
td() { raw <| string f.id }
52-
td() { f.message }
56+
td() { raw <| string fortune.id }
57+
td() { fortune.message }
5358
}
5459
} |> layout
5560

@@ -67,13 +72,11 @@ module HttpHandlers =
6772
message = "Additional fortune added at request time."
6873
}
6974

70-
let private renderFortunes (ctx: HttpContext) dbFortunes =
71-
let augmentedData = [|
72-
yield! dbFortunes
73-
extra
74-
|]
75-
Array.Sort(augmentedData, FortuneComparer)
76-
augmentedData |> HtmlViews.fortunes |> ctx.WriteHtmlView
75+
let rec private renderFortunes (ctx: HttpContext) (dbFortunes: Fortune seq) =
76+
let data = dbFortunes.AsList()
77+
data.Add extra
78+
data.Sort FortuneComparer
79+
data |> HtmlViews.fortunes |> ctx.WriteHtmlView
7780

7881
let private fortunes : EndpointHandler =
7982
fun ctx ->
@@ -85,11 +88,10 @@ module HttpHandlers =
8588

8689
[<Struct>]
8790
[<CLIMutable>]
88-
type World =
89-
{
90-
id: int
91-
randomnumber: int
92-
}
91+
type World = {
92+
id: int
93+
randomnumber: int
94+
}
9395

9496
let private readSingleRow (conn: NpgsqlConnection) =
9597
conn.QueryFirstOrDefaultAsync<World>(
@@ -127,7 +129,7 @@ module HttpHandlers =
127129
}
128130

129131
let private maxBatch = 500
130-
let mutable private queries = Array.zeroCreate (maxBatch + 1)
132+
let private queries = Array.zeroCreate (maxBatch + 1)
131133

132134
let private batchUpdateString batchSize =
133135
match queries[batchSize] with
@@ -141,7 +143,17 @@ module HttpHandlers =
141143
let result = sb.ToString()
142144
queries[batchSize] <- result
143145
result
144-
| q -> q
146+
| q ->
147+
q
148+
149+
let private generateParameters (results: World[]) =
150+
let parameters = Dictionary<string,obj>()
151+
for i in 0..results.Length-1 do
152+
let randomNumber = Random.Shared.Next(1, 10001)
153+
parameters[$"@Rn_{i}"] <- randomNumber
154+
parameters[$"@Id_{i}"] <- results[i].id
155+
results[i] <- { results[i] with randomnumber = randomNumber }
156+
parameters
145157

146158
let private multipleUpdates : EndpointHandler =
147159
fun ctx ->
@@ -153,12 +165,7 @@ module HttpHandlers =
153165
for i in 0..results.Length-1 do
154166
let! result = readSingleRow conn
155167
results[i] <- result
156-
let parameters = Dictionary<string,obj>()
157-
for i in 0..results.Length-1 do
158-
let randomNumber = Random.Shared.Next(1, 10001)
159-
parameters[$"@Rn_{i}"] <- randomNumber
160-
parameters[$"@Id_{i}"] <- results[i].id
161-
results[i] <- { results[i] with randomnumber = randomNumber }
168+
let parameters = generateParameters results
162169
let! _ = conn.ExecuteAsync(batchUpdateString count, parameters)
163170
return! ctx.WriteJsonChunked results
164171
}
@@ -177,7 +184,7 @@ module HttpHandlers =
177184
let endpoints =
178185
[|
179186
route "/plaintext" <| utf8Const "Hello, World!"
180-
route "/json"<| jsonSimple {| message = "Hello, World!" |}
187+
route "/json" <| jsonSimple { message = "Hello, World!" }
181188
route "/fortunes" fortunes
182189
route "/db" singleQuery
183190
route "/queries/{count?}" multipleQueries
@@ -195,11 +202,12 @@ module Main =
195202
let builder = WebApplication.CreateBuilder(args)
196203
builder.Services
197204
.AddRouting()
198-
.AddOxpecker()
199-
|> ignore
200-
builder.Logging.ClearProviders() |> ignore
205+
.AddOxpecker() |> ignore
206+
builder.Logging
207+
.ClearProviders() |> ignore
201208
let app = builder.Build()
202-
app.UseRouting()
203-
.UseOxpecker HttpHandlers.endpoints |> ignore
209+
app
210+
.UseRouting()
211+
.UseOxpecker(HttpHandlers.endpoints) |> ignore
204212
app.Run()
205213
0

0 commit comments

Comments
 (0)