Files
speckle-sharp-sdk/tests/Speckle.Sdk.Tests.Performance/TestDataHelper.cs
T
Adam Hathcock cca8828565 Using Tasks for Deserialization (#143)
* Use a stack channel for deserialization

* multi-threaded

* add object dictionary pool

* more pooling

* adjust sqlite transport

* format

* Optimize IsPropNameValid

* object loader first pass

* save test

* add cache pre check

* save better deserialize

* mostly works

* uses tasks but slower at end

* rework to make more sense

* add check to avoid multi-deserialize

* modify max parallelism

* async enqueuing of tasks

* switch to more asyncenumerable

* fmt

* fmt

* cleanup sqlite

* make ServerObjectManager

* revert change

* add ability to skip cache check

* cache json to know what is loaded

* testing

* clean up usage

* clean up and added new op

* Fix exception handling

* fixing progress

* remove codejam

* remove stackchannel

* remove console writeline

* add cache check shortcut for root object

* recevie2 benchmark

---------

Co-authored-by: Jedd Morgan <45512892+JR-Morgan@users.noreply.github.com>
2024-10-22 14:14:39 +01:00

75 lines
2.1 KiB
C#

using Microsoft.Data.Sqlite;
using Microsoft.Extensions.DependencyInjection;
using Speckle.Sdk.Api;
using Speckle.Sdk.Credentials;
using Speckle.Sdk.Host;
using Speckle.Sdk.Models;
using Speckle.Sdk.Transports;
namespace Speckle.Sdk.Tests.Performance;
public sealed class TestDataHelper : IDisposable
{
private static readonly string s_basePath = $"./temp {Guid.NewGuid()}";
public SQLiteTransport Transport { get; private set; }
public static IServiceProvider ServiceProvider { get; set; }
public string ObjectId { get; private set; }
public TestDataHelper()
{
var serviceCollection = new ServiceCollection();
serviceCollection.AddSpeckleSdk(HostApplications.Navisworks, HostAppVersion.v2023, "Test");
ServiceProvider = serviceCollection.BuildServiceProvider();
}
public async Task SeedTransport(Account account, string streamId, string objectId, bool skipCache)
{
// Transport = new SQLiteTransport(s_basePath, APPLICATION_NAME);
Transport = new SQLiteTransport();
//seed SQLite transport with test data
ObjectId = await SeedTransport(account, streamId, objectId, Transport, skipCache).ConfigureAwait(false);
}
public async Task<string> SeedTransport(
Account account,
string streamId,
string objectId,
ITransport transport,
bool skipCache
)
{
if (!skipCache)
{
using ServerTransport remoteTransport = ServiceProvider
.GetRequiredService<IServerTransportFactory>()
.Create(account, streamId);
transport.BeginWrite();
await remoteTransport.CopyObjectAndChildren(objectId, transport).ConfigureAwait(false);
transport.EndWrite();
await transport.WriteComplete().ConfigureAwait(false);
}
return objectId;
}
public async Task<Base> DeserializeBase()
{
return await ServiceProvider
.GetRequiredService<IOperations>()
.Receive(ObjectId, null, Transport)
.ConfigureAwait(false);
}
public void Dispose()
{
Transport.Dispose();
SqliteConnection.ClearAllPools();
if (Directory.Exists(s_basePath))
{
Directory.Delete(s_basePath, true);
}
}
}