ORC and stdlib optimizations (#15362)
This commit is contained in:
parent
8ae4a774b7
commit
9a34009f00
6 changed files with 45 additions and 29 deletions
BIN
build.out
BIN
build.out
Binary file not shown.
|
|
@ -1247,9 +1247,13 @@ else:
|
||||||
# Descriptor is still present in the queue.
|
# Descriptor is still present in the queue.
|
||||||
case event
|
case event
|
||||||
of Event.Read:
|
of Event.Read:
|
||||||
fdData.readList = newList & fdData.readList
|
let oldReadList = move fdData.readList
|
||||||
|
fdData.readList = move newList
|
||||||
|
fdData.readList.add oldReadList
|
||||||
of Event.Write:
|
of Event.Write:
|
||||||
fdData.writeList = newList & fdData.writeList
|
let oldWriteList = move fdData.writeList
|
||||||
|
fdData.writeList = move newList
|
||||||
|
fdData.writeList.add oldWriteList
|
||||||
else:
|
else:
|
||||||
assert false, "Cannot process callbacks for " & $event
|
assert false, "Cannot process callbacks for " & $event
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -310,6 +310,10 @@ proc skipWhile*(s: string, toSkip: set[char], start = 0): int {.inline.} =
|
||||||
result = 0
|
result = 0
|
||||||
while start+result < s.len and s[result+start] in toSkip: inc(result)
|
while start+result < s.len and s[result+start] in toSkip: inc(result)
|
||||||
|
|
||||||
|
proc fastSubstr(s: string; token: var string; start, length: int) =
|
||||||
|
token.setLen length
|
||||||
|
for i in 0 ..< length: token[i] = s[i+start]
|
||||||
|
|
||||||
proc parseUntil*(s: string, token: var string, until: set[char],
|
proc parseUntil*(s: string, token: var string, until: set[char],
|
||||||
start = 0): int {.inline.} =
|
start = 0): int {.inline.} =
|
||||||
## Parses a token and stores it in ``token``. Returns
|
## Parses a token and stores it in ``token``. Returns
|
||||||
|
|
@ -326,7 +330,8 @@ proc parseUntil*(s: string, token: var string, until: set[char],
|
||||||
var i = start
|
var i = start
|
||||||
while i < s.len and s[i] notin until: inc(i)
|
while i < s.len and s[i] notin until: inc(i)
|
||||||
result = i-start
|
result = i-start
|
||||||
token = substr(s, start, i-1)
|
fastSubstr(s, token, start, result)
|
||||||
|
#token = substr(s, start, i-1)
|
||||||
|
|
||||||
proc parseUntil*(s: string, token: var string, until: char,
|
proc parseUntil*(s: string, token: var string, until: char,
|
||||||
start = 0): int {.inline.} =
|
start = 0): int {.inline.} =
|
||||||
|
|
@ -344,7 +349,8 @@ proc parseUntil*(s: string, token: var string, until: char,
|
||||||
var i = start
|
var i = start
|
||||||
while i < s.len and s[i] != until: inc(i)
|
while i < s.len and s[i] != until: inc(i)
|
||||||
result = i-start
|
result = i-start
|
||||||
token = substr(s, start, i-1)
|
fastSubstr(s, token, start, result)
|
||||||
|
#token = substr(s, start, i-1)
|
||||||
|
|
||||||
proc parseUntil*(s: string, token: var string, until: string,
|
proc parseUntil*(s: string, token: var string, until: string,
|
||||||
start = 0): int {.inline.} =
|
start = 0): int {.inline.} =
|
||||||
|
|
@ -370,7 +376,8 @@ proc parseUntil*(s: string, token: var string, until: string,
|
||||||
if u >= until.len: break
|
if u >= until.len: break
|
||||||
inc(i)
|
inc(i)
|
||||||
result = i-start
|
result = i-start
|
||||||
token = substr(s, start, i-1)
|
fastSubstr(s, token, start, result)
|
||||||
|
#token = substr(s, start, i-1)
|
||||||
|
|
||||||
proc parseWhile*(s: string, token: var string, validChars: set[char],
|
proc parseWhile*(s: string, token: var string, validChars: set[char],
|
||||||
start = 0): int {.inline.} =
|
start = 0): int {.inline.} =
|
||||||
|
|
@ -386,7 +393,8 @@ proc parseWhile*(s: string, token: var string, validChars: set[char],
|
||||||
var i = start
|
var i = start
|
||||||
while i < s.len and s[i] in validChars: inc(i)
|
while i < s.len and s[i] in validChars: inc(i)
|
||||||
result = i-start
|
result = i-start
|
||||||
token = substr(s, start, i-1)
|
fastSubstr(s, token, start, result)
|
||||||
|
#token = substr(s, start, i-1)
|
||||||
|
|
||||||
proc captureBetween*(s: string, first: char, second = '\0', start = 0): string =
|
proc captureBetween*(s: string, first: char, second = '\0', start = 0): string =
|
||||||
## Finds the first occurrence of ``first``, then returns everything from there
|
## Finds the first occurrence of ``first``, then returns everything from there
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,7 @@ const
|
||||||
when defined(nimArcDebug):
|
when defined(nimArcDebug):
|
||||||
include cellsets
|
include cellsets
|
||||||
|
|
||||||
const traceId = 7739 # 1037
|
const traceId = 20 # 1037
|
||||||
|
|
||||||
var gRefId: int
|
var gRefId: int
|
||||||
var freedCells: CellSet
|
var freedCells: CellSet
|
||||||
|
|
@ -90,6 +90,9 @@ proc nimNewObj(size: int): pointer {.compilerRtl.} =
|
||||||
when defined(nimArcDebug) or defined(nimArcIds):
|
when defined(nimArcDebug) or defined(nimArcIds):
|
||||||
head(result).refId = gRefId
|
head(result).refId = gRefId
|
||||||
atomicInc gRefId
|
atomicInc gRefId
|
||||||
|
if head(result).refId == traceId:
|
||||||
|
writeStackTrace()
|
||||||
|
cfprintf(cstderr, "[nimNewObj] %p %ld\n", result, head(result).rc shr rcShift)
|
||||||
when traceCollector:
|
when traceCollector:
|
||||||
cprintf("[Allocated] %p result: %p\n", result -! sizeof(RefHeader), result)
|
cprintf("[Allocated] %p result: %p\n", result -! sizeof(RefHeader), result)
|
||||||
|
|
||||||
|
|
@ -112,6 +115,10 @@ proc nimNewObjUninit(size: int): pointer {.compilerRtl.} =
|
||||||
when defined(nimArcDebug):
|
when defined(nimArcDebug):
|
||||||
head(result).refId = gRefId
|
head(result).refId = gRefId
|
||||||
atomicInc gRefId
|
atomicInc gRefId
|
||||||
|
if head(result).refId == traceId:
|
||||||
|
writeStackTrace()
|
||||||
|
cfprintf(cstderr, "[nimNewObjUninit] %p %ld\n", result, head(result).rc shr rcShift)
|
||||||
|
|
||||||
when traceCollector:
|
when traceCollector:
|
||||||
cprintf("[Allocated] %p result: %p\n", result -! sizeof(RefHeader), result)
|
cprintf("[Allocated] %p result: %p\n", result -! sizeof(RefHeader), result)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,8 @@ const
|
||||||
jumpStackFlag = 0b1000
|
jumpStackFlag = 0b1000
|
||||||
colorMask = 0b011
|
colorMask = 0b011
|
||||||
|
|
||||||
|
logOrc = defined(nimArcIds)
|
||||||
|
|
||||||
type
|
type
|
||||||
TraceProc = proc (p, env: pointer) {.nimcall, benign.}
|
TraceProc = proc (p, env: pointer) {.nimcall, benign.}
|
||||||
DisposeProc = proc (p: pointer) {.nimcall, benign.}
|
DisposeProc = proc (p: pointer) {.nimcall, benign.}
|
||||||
|
|
@ -59,19 +61,17 @@ proc trace(s: Cell; desc: PNimTypeV2; j: var GcEnv) {.inline.} =
|
||||||
var p = s +! sizeof(RefHeader)
|
var p = s +! sizeof(RefHeader)
|
||||||
cast[TraceProc](desc.traceImpl)(p, addr(j))
|
cast[TraceProc](desc.traceImpl)(p, addr(j))
|
||||||
|
|
||||||
when true:
|
when logOrc:
|
||||||
template debug(str: cstring; s: Cell) = discard
|
proc writeCell(msg: cstring; s: Cell; desc: PNimTypeV2) =
|
||||||
else:
|
cfprintf(cstderr, "%s %s %ld root index: %ld; RC: %ld; color: %ld\n",
|
||||||
proc debug(str: cstring; s: Cell) =
|
msg, desc.name, s.refId, s.rootIdx, s.rc shr rcShift, s.color)
|
||||||
let p = s +! sizeof(RefHeader)
|
|
||||||
cprintf("[%s] name %s RC %ld\n", str, p, s.rc shr rcShift)
|
|
||||||
|
|
||||||
proc free(s: Cell; desc: PNimTypeV2) {.inline.} =
|
proc free(s: Cell; desc: PNimTypeV2) {.inline.} =
|
||||||
when traceCollector:
|
when traceCollector:
|
||||||
cprintf("[From ] %p rc %ld color %ld\n", s, s.rc shr rcShift, s.color)
|
cprintf("[From ] %p rc %ld color %ld\n", s, s.rc shr rcShift, s.color)
|
||||||
let p = s +! sizeof(RefHeader)
|
let p = s +! sizeof(RefHeader)
|
||||||
|
|
||||||
debug("free", s)
|
when logOrc: writeCell("free", s, desc)
|
||||||
|
|
||||||
if desc.disposeImpl != nil:
|
if desc.disposeImpl != nil:
|
||||||
cast[DisposeProc](desc.disposeImpl)(p)
|
cast[DisposeProc](desc.disposeImpl)(p)
|
||||||
|
|
@ -90,13 +90,13 @@ proc free(s: Cell; desc: PNimTypeV2) {.inline.} =
|
||||||
|
|
||||||
nimRawDispose(p)
|
nimRawDispose(p)
|
||||||
|
|
||||||
proc nimTraceRef(q: pointer; desc: PNimTypeV2; env: pointer) {.compilerRtl.} =
|
proc nimTraceRef(q: pointer; desc: PNimTypeV2; env: pointer) {.compilerRtl, inline.} =
|
||||||
let p = cast[ptr pointer](q)
|
let p = cast[ptr pointer](q)
|
||||||
if p[] != nil:
|
if p[] != nil:
|
||||||
var j = cast[ptr GcEnv](env)
|
var j = cast[ptr GcEnv](env)
|
||||||
j.traceStack.add(head p[], desc)
|
j.traceStack.add(head p[], desc)
|
||||||
|
|
||||||
proc nimTraceRefDyn(q: pointer; env: pointer) {.compilerRtl.} =
|
proc nimTraceRefDyn(q: pointer; env: pointer) {.compilerRtl, inline.} =
|
||||||
let p = cast[ptr pointer](q)
|
let p = cast[ptr pointer](q)
|
||||||
if p[] != nil:
|
if p[] != nil:
|
||||||
var j = cast[ptr GcEnv](env)
|
var j = cast[ptr GcEnv](env)
|
||||||
|
|
@ -121,11 +121,6 @@ proc unregisterCycle(s: Cell) =
|
||||||
roots.d[idx][0].rootIdx = idx
|
roots.d[idx][0].rootIdx = idx
|
||||||
dec roots.len
|
dec roots.len
|
||||||
|
|
||||||
when false:
|
|
||||||
proc writeCell(msg: cstring; s: Cell; desc: PNimTypeV2) =
|
|
||||||
cfprintf(cstderr, "%s %s %ld root index: %ld; RC: %ld; color: %ld\n",
|
|
||||||
msg, desc.name, s.refId, s.rootIdx, s.rc shr rcShift, s.color)
|
|
||||||
|
|
||||||
proc scanBlack(s: Cell; desc: PNimTypeV2; j: var GcEnv) =
|
proc scanBlack(s: Cell; desc: PNimTypeV2; j: var GcEnv) =
|
||||||
#[
|
#[
|
||||||
proc scanBlack(s: Cell) =
|
proc scanBlack(s: Cell) =
|
||||||
|
|
@ -135,19 +130,17 @@ proc scanBlack(s: Cell; desc: PNimTypeV2; j: var GcEnv) =
|
||||||
if t.color != colBlack:
|
if t.color != colBlack:
|
||||||
scanBlack(t)
|
scanBlack(t)
|
||||||
]#
|
]#
|
||||||
debug "scanBlack", s
|
|
||||||
s.setColor colBlack
|
s.setColor colBlack
|
||||||
let until = j.traceStack.len
|
let until = j.traceStack.len
|
||||||
trace(s, desc, j)
|
trace(s, desc, j)
|
||||||
#writeCell("root still alive", s, desc)
|
when logOrc: writeCell("root still alive", s, desc)
|
||||||
while j.traceStack.len > until:
|
while j.traceStack.len > until:
|
||||||
let (t, desc) = j.traceStack.pop()
|
let (t, desc) = j.traceStack.pop()
|
||||||
inc t.rc, rcIncrement
|
inc t.rc, rcIncrement
|
||||||
debug "incRef", t
|
|
||||||
if t.color != colBlack:
|
if t.color != colBlack:
|
||||||
t.setColor colBlack
|
t.setColor colBlack
|
||||||
trace(t, desc, j)
|
trace(t, desc, j)
|
||||||
#writeCell("child still alive", t, desc)
|
when logOrc: writeCell("child still alive", t, desc)
|
||||||
|
|
||||||
proc markGray(s: Cell; desc: PNimTypeV2; j: var GcEnv) =
|
proc markGray(s: Cell; desc: PNimTypeV2; j: var GcEnv) =
|
||||||
#[
|
#[
|
||||||
|
|
@ -278,8 +271,11 @@ proc collectCyclesBacon(j: var GcEnv) =
|
||||||
s.buffered = false
|
s.buffered = false
|
||||||
collectWhite(s)
|
collectWhite(s)
|
||||||
]#
|
]#
|
||||||
|
when logOrc:
|
||||||
|
for i in 0 ..< roots.len:
|
||||||
|
writeCell("root", roots.d[i][0], roots.d[i][1])
|
||||||
|
|
||||||
for i in 0 ..< roots.len:
|
for i in 0 ..< roots.len:
|
||||||
#writeCell("root", roots.d[i][0], roots.d[i][1])
|
|
||||||
markGray(roots.d[i][0], roots.d[i][1], j)
|
markGray(roots.d[i][0], roots.d[i][1], j)
|
||||||
for i in 0 ..< roots.len:
|
for i in 0 ..< roots.len:
|
||||||
scan(roots.d[i][0], roots.d[i][1], j)
|
scan(roots.d[i][0], roots.d[i][1], j)
|
||||||
|
|
@ -305,7 +301,7 @@ var
|
||||||
|
|
||||||
proc collectCycles() =
|
proc collectCycles() =
|
||||||
## Collect cycles.
|
## Collect cycles.
|
||||||
when false:
|
when logOrc:
|
||||||
cfprintf(cstderr, "[collectCycles] begin\n")
|
cfprintf(cstderr, "[collectCycles] begin\n")
|
||||||
|
|
||||||
var j: GcEnv
|
var j: GcEnv
|
||||||
|
|
@ -335,7 +331,7 @@ proc collectCycles() =
|
||||||
#cfprintf(cstderr, "[collectCycles] freed %ld, touched %ld new threshold %ld\n", j.freed, j.touched, rootsThreshold)
|
#cfprintf(cstderr, "[collectCycles] freed %ld, touched %ld new threshold %ld\n", j.freed, j.touched, rootsThreshold)
|
||||||
elif rootsThreshold < high(int) div 4:
|
elif rootsThreshold < high(int) div 4:
|
||||||
rootsThreshold = rootsThreshold * 3 div 2
|
rootsThreshold = rootsThreshold * 3 div 2
|
||||||
when false:
|
when logOrc:
|
||||||
cfprintf(cstderr, "[collectCycles] end; freed %ld new threshold %ld touched: %ld mem: %ld\n", j.freed, rootsThreshold, j.touched,
|
cfprintf(cstderr, "[collectCycles] end; freed %ld new threshold %ld touched: %ld mem: %ld\n", j.freed, rootsThreshold, j.touched,
|
||||||
getOccupiedMem())
|
getOccupiedMem())
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,8 @@ proc prepareAdd(s: var NimStringV2; addlen: int) {.compilerRtl.} =
|
||||||
s.p = cast[ptr NimStrPayload](reallocShared0(s.p, contentSize(oldCap), contentSize(newCap)))
|
s.p = cast[ptr NimStrPayload](reallocShared0(s.p, contentSize(oldCap), contentSize(newCap)))
|
||||||
s.p.cap = newCap
|
s.p.cap = newCap
|
||||||
|
|
||||||
proc nimAddCharV1(s: var NimStringV2; c: char) {.compilerRtl.} =
|
proc nimAddCharV1(s: var NimStringV2; c: char) {.compilerRtl, inline.} =
|
||||||
|
#if (s.p == nil) or (s.len+1 > s.p.cap and not strlitFlag):
|
||||||
prepareAdd(s, 1)
|
prepareAdd(s, 1)
|
||||||
s.p.data[s.len] = c
|
s.p.data[s.len] = c
|
||||||
s.p.data[s.len+1] = '\0'
|
s.p.data[s.len+1] = '\0'
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue