Skip to content

Commit

Permalink
Switch str:call() to string.call(str) for better perf (#307)
Browse files Browse the repository at this point in the history
  • Loading branch information
RoFlection Bot committed Jul 29, 2022
1 parent a7c030b commit f21e760
Show file tree
Hide file tree
Showing 40 changed files with 414 additions and 264 deletions.
81 changes: 81 additions & 0 deletions bin/compare-benchmarks.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
#!/usr/bin/python

# This script creates a CSV comparing the difference between two benchmark CSVs
# Pass --output or -o to set an output dir, helpful for comparisons and organization (ex: -o bin/featureName-benchmarks)
# Pass the two CSVs as direct args, no --flag-prefix needed

import os
import sys
import re

def percentChange(a, b):
a = a if type(a) == float else float(a)
b = b if type(b) == float else float(b)
return (b-a)/abs(b) * 100

CSVs = []

# Default parameters
parameters = {
"directory": "bin/benchmarks",
}

# Parse command line arguments
argNum = 1
while argNum < len(sys.argv):
arg = sys.argv[argNum]
if arg == "-o" or arg == "--output":
value = sys.argv[argNum+1]
if value[0:1] != "-":
parameters['directory'] = value
else:
print(f"Error: Argument for {arg} is missing, please specify an output directory")
exit(1)

argNum += 2
elif arg[0:1] == "-":
print(f"Error: Unsupported flag {arg}")
exit(1)
else:
CSVs.append(arg)
argNum += 1

csvA = open(CSVs[0], mode="r", encoding="utf-8")
csvB = open(CSVs[1], mode="r", encoding="utf-8")

aName = re.search(r"([\w\-]+)\.csv$", CSVs[0]).group(1).strip().replace("-benchmark", "")
bName = re.search(r"([\w\-]+)\.csv$", CSVs[1]).group(1).strip().replace("-benchmark", "")

csvALines = csvA.readlines()
csvBLines = csvB.readlines()

# Create the results directory
if not os.path.exists(parameters['directory']):
os.makedirs(parameters['directory'])

outputFile = open(f"{parameters['directory']}/compare-{aName}-to-{bName}-benchmark.csv", mode="w", encoding="utf-8")
outputFile.write(f"Test,Metric,{aName},{bName},Unit,Change")
outputFile.write('\n')

headers = {}
for i, line in enumerate(csvALines):
if i == 0:
rawHeaders = line.split(",")
for idx, header in enumerate(rawHeaders):
headers[header] = idx
continue

aValues = line.split(",")
bValues = csvBLines[i].split(",")

outputFile.write("{test},{metric},{a},{b},{unit},{change:.3f}%".format(
test=aValues[headers['Test']],
metric=aValues[headers['Metric']],
a = aValues[headers['Value']],
b = bValues[headers['Value']],
unit = aValues[headers['Unit']],
change = percentChange(aValues[headers['Value']], bValues[headers['Value']]),
))
outputFile.write('\n')

outputFile.close()
8 changes: 7 additions & 1 deletion bin/run-benchmarks.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#
# Pass --output or -o to set an output dir, helpful for comparisons and organization (ex: -o bin/featureName-benchmarks)
# Pass --runs or -r to set how many time each benchmark is run (ex: -r 5)
# Pass --dev or -d to run tests in DEV and COMPAT_WARNINGS mode (ex: --dev)

BENCHMARK_FILES = "bin/run-*-benchmark.lua"
PROJECT_JSON = "tests.project.json"
Expand Down Expand Up @@ -46,6 +47,7 @@ def details(self, root):
parameters = {
"directory": "bin/benchmarks",
"runs": 3,
"dev": "",
}

# Parse command line arguments
Expand All @@ -70,6 +72,10 @@ def details(self, root):
exit(1)

argNum += 2
elif arg == "-d" or arg == "--dev":
parameters['dev'] = " --lua.globals=__DEV__=true --lua.globals=__COMPAT_WARNINGS__=true"

argNum += 1
elif arg[0:1] == "-":
print(f"Error: Unsupported flag {arg}")
exit(1)
Expand Down Expand Up @@ -99,7 +105,7 @@ def details(self, root):
for i in range(1, parameters['runs']+1):
print(f" Run {i}", flush=True)
runResults = subprocess.Popen(
f"robloxdev-cli run --load.model {PROJECT_JSON} --run {test} --headlessRenderer 1 --fastFlags.overrides \"EnableDelayedTaskMethods=true\" \"FIntScriptProfilerFrequency=1000000\" \"DebugScriptProfilerEnabled=true\" \"EnableLoadModule=true\" --fastFlags.allOnLuau",
f"robloxdev-cli run --load.model {PROJECT_JSON} --run {test} --headlessRenderer 1 --fastFlags.overrides \"EnableDelayedTaskMethods=true\" \"FIntScriptProfilerFrequency=1000000\" \"DebugScriptProfilerEnabled=true\" \"EnableLoadModule=true\" --fastFlags.allOnLuau" + parameters['dev'],
encoding="utf-8", stdout=logFile,
)
runResults.wait()
Expand Down
2 changes: 1 addition & 1 deletion examples/changed-signal/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ return function()
return React.createElement("TextLabel", {
LayoutOrder = layoutOrder,
Size = UDim2.new(1, 0, 0.5, 0),
Text = "Reversed: " .. inputText:reverse(),
Text = "Reversed: " .. string.reverse(inputText),
})
end

Expand Down
2 changes: 1 addition & 1 deletion examples/init.client.lua
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ function Examples.makeExampleList()
listLayout.Parent = exampleList

for index, example in exampleData do
local label = ("%s\nexamples/%s"):format(example.label, example.name)
local label = string.format("%s\nexamples/%s", example.label, example.name)

local exampleCard = Instance.new("TextButton")
exampleCard.Name = "Example: " .. example.name
Expand Down
50 changes: 36 additions & 14 deletions modules/react-devtools-shared/src/backend/agent.lua
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,9 @@ function Agent:copyElementPath(copyElementParams: CopyElementParams): ()
local renderer: RendererInterface? = self._rendererInterfaces[rendererID]

if renderer == nil then
console.warn(('Invalid renderer id "%d" for element "%d"'):format(rendererID, id))
console.warn(
string.format('Invalid renderer id "%d" for element "%d"', rendererID, id)
)
else
(renderer :: RendererInterface).copyElementPath(id, path)
end
Expand All @@ -319,7 +321,9 @@ function Agent:deletePath(deletePathParams: DeletePathParams): ()
local renderer: RendererInterface? = self._rendererInterfaces[rendererID]

if renderer == nil then
console.warn(('Invalid renderer id "%d" for element "%d"'):format(rendererID, id))
console.warn(
string.format('Invalid renderer id "%d" for element "%d"', rendererID, id)
)
else
(renderer :: RendererInterface).deletePath(type_, id, hookID, path)
end
Expand All @@ -331,7 +335,7 @@ function Agent:getInstanceAndStyle(
local renderer: RendererInterface? = self._rendererInterfaces[rendererID]

if renderer == nil then
console.warn(('Invalid renderer id "%d"'):format(rendererID))
console.warn(string.format('Invalid renderer id "%d"', rendererID))
return nil
end

Expand All @@ -358,7 +362,7 @@ function Agent:getProfilingData(rendererIdObject: { rendererID: RendererID }): (
local renderer: RendererInterface? = self._rendererInterfaces[rendererID]

if renderer == nil then
console.warn(('Invalid renderer id "%d"'):format(rendererID))
console.warn(string.format('Invalid renderer id "%d"', rendererID))
end

self._bridge:send("profilingData", (renderer :: RendererInterface).getProfilingData())
Expand All @@ -371,7 +375,9 @@ function Agent:getOwnersList(elementAndRendererID: ElementAndRendererID)
local renderer: RendererInterface? = self._rendererInterfaces[rendererID]

if renderer == nil then
console.warn(('Invalid renderer id "%d" for element "%d"'):format(rendererID, id))
console.warn(
string.format('Invalid renderer id "%d" for element "%d"', rendererID, id)
)
else
local owners = (renderer :: RendererInterface).getOwnersList(id)

Expand All @@ -389,7 +395,9 @@ function Agent:inspectElement(inspectElementParams: InspectElementParams)
local renderer: RendererInterface? = self._rendererInterfaces[rendererID]

if renderer == nil then
console.warn(('Invalid renderer id "%d" for element "%d"'):format(rendererID, id))
console.warn(
string.format('Invalid renderer id "%d" for element "%d"', rendererID, id)
)
else
self._bridge:send(
"inspectedElement",
Expand Down Expand Up @@ -421,7 +429,9 @@ function Agent:logElementToConsole(elementAndRendererID: ElementAndRendererID)
local renderer: RendererInterface? = self._rendererInterfaces[rendererID]

if renderer == nil then
console.warn(('Invalid renderer id "%d" for element "%d"'):format(rendererID, id))
console.warn(
string.format('Invalid renderer id "%d" for element "%d"', rendererID, id)
)
else
(renderer :: RendererInterface).logElementToConsole(id)
end
Expand All @@ -434,7 +444,9 @@ function Agent:overrideSuspense(overrideSuspenseParams: OverrideSuspenseParams)
local renderer: RendererInterface? = self._rendererInterfaces[rendererID]

if renderer == nil then
console.warn(('Invalid renderer id "%d" for element "%d"'):format(rendererID, id))
console.warn(
string.format('Invalid renderer id "%d" for element "%d"', rendererID, id)
)
else
(renderer :: RendererInterface).overrideSuspense(id, forceFallback)
end
Expand All @@ -450,7 +462,9 @@ function Agent:overrideValueAtPath(overrideValueAtPathParams: OverrideValueAtPat
local renderer: RendererInterface? = self._rendererInterfaces[rendererID]

if renderer == nil then
console.warn(('Invalid renderer id "%d" for element "%d"'):format(rendererID, id))
console.warn(
string.format('Invalid renderer id "%d" for element "%d"', rendererID, id)
)
else
(renderer :: RendererInterface).overrideValueAtPath(
type_,
Expand Down Expand Up @@ -583,7 +597,9 @@ function Agent:renamePath(renamePathParams: RenamePathParams)
local renderer: RendererInterface? = self._rendererInterfaces[rendererID]

if renderer == nil then
console.warn(('Invalid renderer id "%d" for element "%d"'):format(rendererID, id))
console.warn(
string.format('Invalid renderer id "%d" for element "%d"', rendererID, id)
)
else
(renderer :: RendererInterface).renamePath(type_, id, hookID, oldPath, newPath)
end
Expand Down Expand Up @@ -671,7 +687,9 @@ function Agent:storeAsGlobal(storeAsGlobalParams: StoreAsGlobalParams)
local renderer: RendererInterface? = self._rendererInterfaces[rendererID]

if renderer == nil then
console.warn(('Invalid renderer id "%d" for element "%d"'):format(rendererID, id))
console.warn(
string.format('Invalid renderer id "%d" for element "%d"', rendererID, id)
)
else
(renderer :: RendererInterface).storeAsGlobal(id, path, count)
end
Expand Down Expand Up @@ -710,7 +728,9 @@ function Agent:viewAttributeSource(copyElementParams: CopyElementParams)
local renderer: RendererInterface? = self._rendererInterfaces[rendererID]

if renderer == nil then
console.warn(('Invalid renderer id "%d" for element "%d"'):format(rendererID, id))
console.warn(
string.format('Invalid renderer id "%d" for element "%d"', rendererID, id)
)
else
(renderer :: RendererInterface).prepareViewAttributeSource(id, path)
end
Expand All @@ -720,7 +740,9 @@ function Agent:viewElementSource(elementAndRendererID: ElementAndRendererID)
local renderer: RendererInterface? = self._rendererInterfaces[rendererID]

if renderer == nil then
console.warn(('Invalid renderer id "%d" for element "%d"'):format(rendererID, id))
console.warn(
string.format('Invalid renderer id "%d" for element "%d"', rendererID, id)
)
else
(renderer :: RendererInterface).prepareViewElementSource(id)
end
Expand Down Expand Up @@ -762,7 +784,7 @@ function Agent:onHookOperations(operations: Array<number>)
local renderer: RendererInterface? = self._rendererInterfaces[rendererID]

if renderer == nil then
console.warn(('Invalid renderer id "%d"'):format(rendererID))
console.warn(string.format('Invalid renderer id "%d"', rendererID))
else
local prevMatch = self._persistedSelectionMatch
local nextMatch =
Expand Down
Loading

0 comments on commit f21e760

Please sign in to comment.