两者都是序列化库,由Google开发人员开发.他们之间有什么大不同吗?将代码从协议缓冲区转移到FlatBuffers是一项艰苦的工作吗?
我决定找出 Protobuf、Flatbuffers 和 Cap'n proto 中的哪一个是我的应用程序最好/最快的序列化。在我的情况下,通过网络发送某种字节/字符数组(我序列化为该格式的原因)。所以我对所有三个都做了简单的实现,其中我对一个字符串、一个浮点数和一个整数进行了序列化和反序列化。这给出了意想不到的结果:Protobuf 是最快的。我会称它们为意外,因为 cap'n proto 和 flatbuffes 都“声称”是更快的选择。在我接受这一点之前,我想看看我是否无意中在我的代码中作弊。如果我没有作弊,我想知道为什么 protobuf 更快(究竟为什么可能是不可能的)。对于 cap'n proto 和 faltbuffers 来说,这些消息是否可以简单到真正让它们大放异彩?
我的时间:
flatbuffers 所用
时间:14162 微秒 capnp 所用
时间:60259 微秒protobuf 所用时间:12131 微秒
(显然这些取决于我的机器,但重要的是相对时间)
平面缓冲区代码:
int main (int argc, char *argv[]){
std::string s = "string";
float f = 3.14;
int i = 1337;
std::string s_r;
float f_r;
int i_r;
flatbuffers::FlatBufferBuilder message_sender;
int steps = 10000;
auto start = high_resolution_clock::now();
for (int j = 0; j < steps; j++){
auto autostring = …Run Code Online (Sandbox Code Playgroud) 我一直在研究Apache Thrift,ProtoBuf和Flatbuffers.我发现教程在链接中使用带有protobuf的gRPC,但我没有找到任何使用gRPC和Flatbuffers的文档.有人可以指点我的相关文件吗?我在谷歌和Stackoverflow上查了一下.任何帮助,将不胜感激.
我正在尝试更改flatbuffers库 CMakeLists.txt以使PUBLIC有一些标志.然后,我重写了这些内容:
原始代码
elseif(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -Wall -pedantic -Werror -Wextra")
endif()
Run Code Online (Sandbox Code Playgroud)
新代码
elseif(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
target_compile_definitions(flatbuffers PUBLIC "-std=c++0x -Wall -pedantic -Werror -Wextra")
endif()
Run Code Online (Sandbox Code Playgroud)
目标名称是flatc,当我开始构建项目时,我会收到:
Scanning dependencies of target flatc
[ 7%] Building CXX object CMakeFiles/flatc.dir/src/idl_parser.cpp.obj
<command-line>:0:1: error: macro names must be identifiers
Run Code Online (Sandbox Code Playgroud)
使用这些标志将"set(CMAKE_CXX_FLAGS)"转换为"target_compile_definitions()"是错误的吗?
我对C++和Google FlatBuffers中的文件流有基本了解.Schema文件非常简单,还可以创建缓冲区并从缓冲区指针读取.我没有得到的是如何将多个缓冲区保存到二进制文件中,然后读取该二进制文件以获取任何随机缓冲区.
这是一个带有两个浮点数的简单Schema:
table Car {
field_a:[float];
field_b:[float];
}
Run Code Online (Sandbox Code Playgroud)
.
用于构建缓冲区的函数(尽管没有保存文件):
bool save_flatbuf(string file_path, vector<double> vec_a, vector<double> vec_b) {
flatbuffers::FlatBufferBuilder builder;
auto vec_floats_a = builder.CreateVector(vec_a, vec_a.size());
auto vec_floats_b = builder.CreateVector(vec_b, vec_b.size());
auto mloc = CreateCar(builder, &vec_floats_a, &vec_floats_b);
builder.Finish(mloc);
// How to save it into a binary file with a list of "Cars"?
}
Run Code Online (Sandbox Code Playgroud)
.
还有一个从二进制文件中读取缓冲区后读取缓冲区的函数(没有文件读取):
bool read_flatbuf(string file_path) {
// How to get the buffer pointer to a "Car" from a binary file with a "list of Cars" ? …Run Code Online (Sandbox Code Playgroud) 请帮助建议Flatbuffers和CBOR协议的优缺点。这两种二进制格式都声称在它们的网站上是不错的,但是我无法在两者之间做出一些很好的区别。
平面缓冲区:
优点:
坏处:
CBOR
优点:
坏处:
PS:
与平缓缓冲区相比,感觉CBOR中的类型管理将在性能上付出高昂的代价,但是由于CBOR是标准化协议,因此如果这种差异不大,我倾向于使用它。请让我知道你们都推荐两个,为什么。
我有两个关于在 python 中使用 flatbuffers 的问题,重点是如何以正确的方式使用它们而不编写完全破坏其性能优势的代码。我想使用 flatbuffers 在 C# 和 python 程序之间进行序列化和网络通信。我已经阅读了教程、python 细节和一些使用其他语言和平面缓冲区的博客文章,但找不到适用于 python 的语言。
1.) Flatbuffers 用于快速序列化。这对python来说是真的吗?python的性能只是指出“好的”,而其他语言则“很棒”。具体时间不详。我知道 python 通常不如 C 或 C++ 快,但我们说的有多慢?达到它所承诺的性能优势(例如与 JSON 相比)的地步?也许有人已经用 python 做了一个基准测试?如果没有,我将尝试编写一个比较 C# 和 python 之间的时间以及 python 中 flattbuffers 与 json 的比较。
2.) 它很快,因为“零拷贝”。但这对于需要更改数据的程序意味着什么?特别是因为对象是不可变的。为了使用它们,我需要将值复制到对象的本地表示中。不打败那个目的吗?本教程说明了从 flatbuffer 读取的示例:
import MyGame.Example as example
import flatbuffers
buf = open('monster.dat', 'rb').read()
buf = bytearray(buf)
monster = example.GetRootAsMonster(buf, 0)
hp = monster.Hp()
pos = monster.Pos()
Run Code Online (Sandbox Code Playgroud)
最后两行不就是副本吗?
我正在尝试使用FlatBuffers来存储OpenStreetMap数据.所以,这将是50GB.
由于通常所有内容都保存在内存中,如何将数据顺序写入文件是否可能(如果有的话)?
我有一种感觉,这不是FlatBuffers有用的地方.
在打字稿中,我使用的是这样的 flatbuffers:
import {flatbuffers} from 'flatbuffers';
const builder = new flatbuffers.Builder(1);
Run Code Online (Sandbox Code Playgroud)
然后我编译为 js 以与 react-native 一起使用:
const flatbuffers_1 = require("flatbuffers");
const builder = new flatbuffers_1.flatbuffers.Builder(1);
Run Code Online (Sandbox Code Playgroud)
但我收到错误:
undefined is not an object (evaluating 'new flatbuffers_1.flatbuffers.Builder')
Run Code Online (Sandbox Code Playgroud)
发生什么事?
我将通过连接发送多种缓冲区类型.为了简单起见,想象一下这样的架构:
namespace MyEvents;
table EventOne
{
id:uint;
timestamp:ulong;
adress:string;
}
table EventTwo
{
id:uint;
timestamp:ulong;
strength:float;
}
union Events {EventOne, EventTwo}
table EventHolder
{
theEvent:Events;
}
root_type EventHolder;
Run Code Online (Sandbox Code Playgroud)
我为C++和C#生成了所需的文件,并在我各自的项目中根据需要包含它们.
以下是我在C++中编码事件的方法 - 这里是EventOne类型的事件:
...
uint32_t anId(645);
uint64_t aTimestamp(1234567);
string anAddress("00::00::45::56::47::e5");
flatbuffers::FlatBufferBuilder builder;
auto addressOffset= builder.CreateString(anAddress);
auto eventOneOffset= MyEvents::CreateEventOne(builder, anId, aTimestamp, addressOfset);
// Here is where I am confused - how to create the EventHolder object.
// Original code I posted about - commented out, but has error.
//auto eventHolderOffset= MyEvents::CreateEventHolder(builder, MyEvents::Events_EventOne, …Run Code Online (Sandbox Code Playgroud) flatbuffers ×10
c++ ×5
capnproto ×2
binaryfiles ×1
c# ×1
cbor ×1
cmake ×1
fstream ×1
gcc ×1
grpc ×1
javascript ×1
json ×1
python ×1
react-native ×1
typescript ×1