Skip to content

Commit 03b9bbe

Browse files
Improve compilation performance
1 parent c1b8c17 commit 03b9bbe

3 files changed

Lines changed: 44 additions & 20 deletions

File tree

src/CSharpPluginLoader.cs

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using System.Linq;
99
using System.Text.RegularExpressions;
1010
using Oxide.CSharp.Common;
11+
using Oxide.Pooling;
1112

1213
namespace Oxide.Plugins
1314
{
@@ -241,14 +242,27 @@ public void CompilationRequested(CompilablePlugin plugin)
241242
Compilation.Current.Add(plugin);
242243
return;
243244
}
245+
244246
if (_compilationQueue.Count < 1)
245247
{
246248
Interface.Oxide.NextTick(() =>
247249
{
248-
CompileAssembly(_compilationQueue.ToArray());
249-
_compilationQueue.Clear();
250+
List<CompilablePlugin> compilablePlugins = PoolFactory<List<CompilablePlugin>>.Shared.Take();
251+
try
252+
{
253+
compilablePlugins.AddRange(_compilationQueue);
254+
_compilationQueue.Clear();
255+
256+
CompileAssembly(compilablePlugins);
257+
}
258+
finally
259+
{
260+
compilablePlugins.Clear();
261+
PoolFactory<List<CompilablePlugin>>.Shared.Return(compilablePlugins);
262+
}
250263
});
251264
}
265+
252266
_compilationQueue.Add(plugin);
253267
}
254268

@@ -278,7 +292,7 @@ private void PluginLoadingCompleted(CompilablePlugin plugin)
278292
}
279293
}
280294

281-
private void CompileAssembly(CompilablePlugin[] plugins)
295+
private void CompileAssembly(List<CompilablePlugin> plugins)
282296
{
283297
_compiler.Compile(plugins, compilation =>
284298
{
@@ -291,31 +305,41 @@ private void CompileAssembly(CompilablePlugin[] plugins)
291305
GetPluginErrors(plugin.Name).Add($"Failed to compile:{Environment.NewLine}{errors}");
292306
Interface.Oxide.LogError($"Error while compiling {plugin.ScriptName}:{Environment.NewLine}{errors}");
293307
}
308+
309+
return;
294310
}
295-
else
311+
312+
if (compilation.plugins.Count == 0)
296313
{
297-
if (compilation.plugins.Count > 0)
298-
{
299-
string[] compiledNames = compilation.plugins.Where(pl => pl.CompilerErrors.Count == 0).Select(pl => pl.Name).ToArray();
300-
string verb = compiledNames.Length > 1 ? "were" : "was";
301-
Interface.Oxide.LogInfo($"{compiledNames.ToSentence()} {verb} compiled successfully in {Math.Round(compilation.duration * 1000f)}ms");
302-
}
314+
return;
315+
}
303316

317+
List<string> compiledPlugins = PoolFactory<List<string>>.Shared.Take();
318+
try
319+
{
304320
foreach (CompilablePlugin plugin in compilation.plugins)
305321
{
306-
if (plugin.CompilerErrors.Count == 0)
307-
{
308-
Interface.Oxide.UnloadPlugin(plugin.Name);
309-
plugin.OnCompilationSucceeded(compilation.compiledAssembly);
310-
}
311-
else
322+
if (plugin.CompilerErrors.Count > 0)
312323
{
313324
plugin.OnCompilationFailed();
314325
string errors = plugin.CompilerErrors.JoinValues(Environment.NewLine);
315326
GetPluginErrors(plugin.Name).Add($"Failed to compile:{Environment.NewLine}{errors}");
316327
Interface.Oxide.LogError($"Error while compiling {plugin.ScriptName}:{Environment.NewLine}{errors}");
328+
continue;
317329
}
330+
331+
Interface.Oxide.UnloadPlugin(plugin.Name);
332+
plugin.OnCompilationSucceeded(compilation.compiledAssembly);
333+
compiledPlugins.Add(plugin.Name);
318334
}
335+
336+
string verb = compiledPlugins.Count > 1 ? "were" : "was";
337+
Interface.Oxide.LogInfo($"{compiledPlugins.JoinValues(", ")} {verb} compiled successfully in {Math.Round(compilation.duration * 1000f)}ms");
338+
}
339+
finally
340+
{
341+
compiledPlugins.Clear();
342+
PoolFactory<List<string>>.Shared.Return(compiledPlugins);
319343
}
320344
});
321345
}

src/Compilation.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ internal class Compilation
3232
private string includePath;
3333
private string[] extensionNames;
3434

35-
internal Compilation(int id, Action<Compilation> callback, CompilablePlugin[] plugins)
35+
internal Compilation(int id, Action<Compilation> callback, List<CompilablePlugin> plugins)
3636
{
3737
this.id = id;
3838
this.callback = callback;

src/CompilerService.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ private void OnMessageReceived(CompilerMessage message)
339339
}
340340
}
341341

342-
CompilationResult compilationResult = Constants.Serializer.Deserialize<CompilationResult>(message.Data);
342+
CompilationResult? compilationResult = Constants.Serializer.Deserialize<CompilationResult>(message.Data);
343343
if (compilationResult.Data == null || compilationResult.Data.Length == 0)
344344
{
345345
compilation.Completed();
@@ -522,11 +522,11 @@ private void ResetIdleTimer()
522522
() => Stop(false, "idle shutdown"));
523523
}
524524

525-
internal void Compile(CompilablePlugin[] plugins, Action<Compilation> callback)
525+
internal void Compile(List<CompilablePlugin> plugins, Action<Compilation> callback)
526526
{
527527
ResetIdleTimer();
528528
int id = _lastId++;
529-
Compilation compilation = new Compilation(id, callback, plugins);
529+
Compilation compilation = new(id, callback, plugins);
530530
_compilations[id] = compilation;
531531
compilation.Prepare(() => EnqueueCompilation(compilation));
532532
}

0 commit comments

Comments
 (0)