Bebop - 엄청 빠른 데이터 교환 포맷 | GeekNews

9 Likes

betwixt-labs/bebop: :saxophone:No ceremony, just code. Blazing fast, typesafe binary serialization. (github.com)

저장소는 이거군요…

확실…한가…진짜면 ㅎㄷㄷ한데요…

Cysharp/MemoryPack: Zero encoding extreme performance binary serializer for C# and Unity. (github.com)

지난 번에 @jacking75 님께서 소개해 주신 MemoryPack 하고도 비교가 있으면 좋겠지만…

4 Likes

벤치마크가 사실이고 언어의존성 까지 없다면,

이거 엄청난 지각변동이 일어나겠군요 ㄷㄷㄷ

5 Likes

https://docs.bebop.sh/guide/getting-started-csharp/

새로운 것을 알았으니 확인 해볼 필요가 있습니다.

관련된 패키지를 설치하고,

dotnet add package bebop
dotnet add package bebop-tools

bop 스키마(.bop)를 이용해 .cs 파일을 생성하기 위해 다음을 구성합니다.

  <ItemGroup>
    <Bebop Include="**/*.bop" OutputDir="./Models/" OutputFile="Models.g.cs" Namespace="BebopTest.Models" />
  </ItemGroup>

그런 후 bop 파일을 생성하고
| Models.bop

struct Hello {
    int32 x;
    int32 y;
}

컴파일 하는데 아~무런 반응이 없었습니다. 원인을 찾기 위해 bebop-tools의 빌드 파일을 확인, 프로젝트 설정에 다음을 추가하면 디버그 정보가 표시된다는 것을 확인하고

  <Target Name="BebopPrepareForBuildDebug" AfterTargets="PrepareForBuild">
    <CallTarget Targets="BebopPrepareForBuildDiagnostic"/>
  </Target> 

결과를 확인했더니 다음처럼 빌드-bebopc 실행 오류가 납니다.

1>Bebop Prepare For Build Diagnostic
1>Bebop Compiler Path = W:\dimohy\.nuget\packages\bebop-tools\3.0.4\tools\windows\x64\bebopc.exe
1>Bebop Output Directory = ./Models/
1>Bebop Output File = Models.g.cs
1>Bebop Target Language = cs
1>Bebop LangVersion = 9.0
1>Bebop Log Format = MSBuild
1>Bebop Namespace = BebopTest.Models
1>Input Schemas = "W:\Enjoy\BebopTest\models.bop"
1>Bebop Output = W:\Enjoy\BebopTest\Models\Models.g.cs
1>Incomplete generator token specified 'cs:W:\Enjoy\BebopTest\Models\Models.g.cs,namespace=BebopTest.Models,langVersion=9.0'.
1>
1>W:\dimohy\.nuget\packages\bebop-tools\3.0.4\build\bebop-tools.targets(66,9): error MSB3073: "..." 명령이 종료되었습니다(코드: 1).

아… generator (bebopc의 --generator 인자 값) 의 토큰이 윈도 드라이버의 ':'랑 충돌하는 듯 해 보입니다;

cs:W:의 ‘:’

관련해서 버그 신고를 했고

사용 못해보는 것이 아쉬워서 상대경로로 윈도 드라이버 문자를 제거한 후 bebopcwatch기능을 이용해 동작성을 확인했습니다.

W:\Enjoy\BebopTest>"W:\dimohy\.nuget\packages\bebop-tools\3.0.4\tools\windows\x64\bebopc.exe" --include "models.bop" watch --generator "cs:Models\Models.g.cs,namespace=BebopTest.Models,langVersion=9.0"
                  Watching
┌──────────────────────┬────────────────────┐
│ Status               │ Path               │
├──────────────────────┼────────────────────┤
│ Watching             │ W:/Enjoy/BebopTest │
│                      │                    │
│ Excluded Directories │                    │
│                      │                    │
│ Excluded Files       │                    │
└──────────────────────┴────────────────────┘

이제 Models.bop 파일을 갱신할 때마다 bebopc watch 동작에 의해서 Models/Models.g.cs파일이 생기는 것을 확인 했고

| Models/Models.g.cs

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//
//
//       bebopc version:
//           3.0.4
//
//
//       bebopc source:
//           https://github.com/betwixt-labs/bebop
//
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//
// This source code was auto-generated by bebopc, Version=3.0.4.
//
namespace BebopTest.Models {

  [global::System.CodeDom.Compiler.GeneratedCode("bebopc", "3.0.4")]
  [global::Bebop.Attributes.BebopRecord(global::Bebop.Runtime.BebopKind.Struct)]
  public partial class Hello : global::Bebop.Runtime.BaseBebopRecord, global::System.IEquatable<Hello> {
...

다음의 코드를 통해 잘 동작함을 확인하였습니다.

| Program.cs

using BebopTest.Models;

var source = new Hello(5, 10);
var data = source.Encode();
var target = Hello.Decode(data);
Console.WriteLine($"X:{target.X}, Y:{target.Y}");

| 출력

X:5, Y:10

얼마나 빠른지 궁금해서 간단히 다음 코드로 인코딩 및 디코딩을 천만번 반복했는데

using System.Diagnostics;

using BebopTest.Models;

var sw = Stopwatch.StartNew();
for (var i = 0; i < 10000000; i++)
{
    var source = new Hello(5, 10);
    var data = source.Encode();
    var target = Hello.Decode(data);
    if (i % 100000 == 0)
        Console.WriteLine($"{i}: X:{target.X}, Y:{target.Y}");
}
sw.Stop();
Console.WriteLine($"{sw.ElapsedMilliseconds} ms");

183 ms 가 나오네요. 빠릅니다!

13 Likes

해당 문제가 수정되어 3.0.5에 해결되었다고 합니다. 빠르네요!

7 Likes

크으 컨트리뷰터다…

2 Likes