- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我最近开始学习 cpp-netlib 并且正在测试一个 netlibs 示例程序
#include <boost/network/protocol/http/client.hpp>
#include <iostream>
int main()
{
using namespace boost::network;
http::client client;
http::client::request request("http://www.boost.org");
request << header("Connection", "close");
http::client::response response = client.get(request);
std::cout << body(response) << std::endl;
return 0;
}
经过几个小时的研究,我发现编译我的程序需要使用的正确命令是
clang++ -std=c++11 -I /usr/local/Cellar/openssl/1.0.2e/include test.cpp -L /usr/local/Cellar/openssl/1.0.2e/lib -lboost_system-mt -lboost_thread-mt -lcppnetlib-client-connections -lcppnetlib-uri -lcppnetlib-server-parsers -lssl -lcrypto
这是我发布的一个较旧问题的链接,该问题详细说明了我如何找到编译该程序所需的一切 cpp-Netlib with Boost Mac OSX seg fault when using HTTP Client body
我发现编译大约需要 15 秒,想知道是否有办法加快这个过程?编译此代码真的这么慢还是链接器花费大量时间来获取所有这些库,如果是这样我可以加快速度吗?
最佳答案
我好像记得 cpp-netlib 使用 Spirit Qi grammarts 来解析 URL e.g.
network/uri/accessors.hpp
network/uri/uri.ipp
In this case the slowdown seems to be the
key_value_sequence
parser inaccessors.hpp
这些模板非常繁重,需要花费大量时间进行编译,仅略微取决于所使用的编译器(根据我的经验,MSVC 最差)。
您可以阻止包含这些 header 。至少只将它们包含在需要它的翻译单元 (cpp
s) 中;永远不要让它陷入您的“常见” header 依赖项中。这意味着编译器必须在每次迭代时重新编译这些东西(即使使用预编译头文件,成本也可能很高)。
根据您的编译器版本,这些可能会有所帮助:
FUSION_MAX_VECTOR_SIZE
等定义为较小的数字(默认值:10)真的,如果您使用支持 c++14 的 clang,我有兴趣测试一个补丁以使用 Spirit X3 而不是 Qi。
至少替换这个 Qi 解析器:
#include <boost/spirit/include/qi.hpp>
// ...
namespace details {
template <typename Map>
struct key_value_sequence : spirit::qi::grammar<uri::const_iterator, Map()> {
typedef typename Map::key_type key_type;
typedef typename Map::mapped_type mapped_type;
typedef std::pair<key_type, mapped_type> pair_type;
key_value_sequence() : key_value_sequence::base_type(query) {
query = pair >> *((spirit::qi::lit(';') | '&') >> pair);
pair = key >> -('=' >> value);
key =
spirit::qi::char_("a-zA-Z_") >> *spirit::qi::char_("-+.~a-zA-Z_0-9/%");
value = +spirit::qi::char_("-+.~a-zA-Z_0-9/%");
}
spirit::qi::rule<uri::const_iterator, Map()> query;
spirit::qi::rule<uri::const_iterator, pair_type()> pair;
spirit::qi::rule<uri::const_iterator, key_type()> key;
spirit::qi::rule<uri::const_iterator, mapped_type()> value;
};
} // namespace details
template <class Map>
inline Map &query_map(const uri &uri_, Map &map) {
const uri::string_type range = uri_.query();
details::key_value_sequence<Map> parser;
spirit::qi::parse(boost::begin(range), boost::end(range), parser, map);
return map;
}
使用此 X3 变体:
#include <boost/spirit/home/x3.hpp>
// ...
namespace details {
namespace kvs_parser {
namespace x3 = boost::spirit::x3;
static auto const key = x3::char_("a-zA-Z_") >> *x3::char_("-+.~a-zA-Z_0-9/%");
static auto const value = +x3::char_("-+.~a-zA-Z_0-9/%");
template <typename Map, typename K = typename Map::key_type, typename V = typename Map::mapped_type, typename Pair = std::pair<K, V> >
static auto const pair = x3::rule<struct kvs_pair, Pair> {}
= key >> -('=' >> value);
template <typename Map>
static auto const query = pair<Map> >> *((x3::lit(';') | '&') >> pair<Map>);
}
} // namespace details
template <class Map>
inline Map &query_map(const uri &uri_, Map &map) {
const uri::string_type range = uri_.query();
spirit::x3::parse(boost::begin(range), boost::end(range), details::kvs_parser::query<Map>, map);
return map;
}
在我的系统上将编译时间从约 8 秒减少到约 5 秒
BIG FAT WARNING The X3 code is untested (I don't even know what uses it, I just "blindly" translated to X3 to the best of my knowledge)
关于c++ - 为什么我的简单 cpp-netlib 程序需要这么长时间才能编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34099751/
我在理解 cpp netlib 文档时遇到一些问题。 member name type description headers vector Vecto
我认为我的问题真的很微不足道,但我还是无法让它发挥作用 std::string url="www.google.it"; boost::network::http::client client1_(_
类似于(但比)这个 unanswered question about headers in cpp-netlib HTTP server side 的问题。 这是在 Linux/Debian/Sid
我想在我的 Windows 上运行的 C++ 项目中使用 cpp-netlib 库。我已严格按照 http://cpp-netlib.github.com/getting_started.html 下
我想将库 cpp-netlib 用于 C++ 项目。因此,我在自制软件的帮助下安装了 boost 库(操作系统是 Mac OS X 10.8)。然后我从项目主页下载了cpp-netlib,使用cmak
是否有可能通过 cpp-netlib 获得接受的连接?并像普通 TCP Boost.asio 套接字一样使用它? 最佳答案 boost::network::http::impl::http_async
我想知道是否有可能获得 0.9.1 版 cpp-netlib 中现在存在的 Windows 静态库(x86 和 x64)的二进制文件? 坦率地说,对我来说在 Windows 上编译它是一件痛苦的事情。
进程文件: Netlib or Netlib.exe 进程名称: Crater-A Trojan/Worm 进程类别:存在安全风险的进程 英文描述: Netlib.exe is a proc
// Copyright 2009 (c) Tarro, Inc. // Copyright 2009 (c) Dean Michael Berris // Distributed under th
我在 Visual Studio 2010 中使用 cpp-netlib-0.9.4。我有一个 make_header 函数,如下所示: http::client::request* Interfac
我设法安装并运行了 boost,我还部分地编译了 cpp-netlib 的示例代码,但我陷入了这个编译错误: obj\Debug\main.o||In function 'ZN5boost7netwo
我正在尝试使用 cppnetlib,甚至是 boost asio 库进行连接,以执行简单的 url 获取并下拉生成的页面。 我已经让它与 http 一起工作,甚至 https 使用 cppnetlib
我正在尝试使用 boost 和 cpp-netlib。 cpp-netlib 的静态库大约是40m(发行版),即使链接到一个小的helloworld 也可能非常慢。所以我想在开发时尝试动态dll+ i
Spark 的 MLLib 指出 https://github.com/fommil/netlib-java是 dependency . 但是,这个 repo 已从 github 中删除(上面的链接已
背景与问题 我在运行 Fedora 23 的机器上运行 Spark 的 MLLib 中的示例时遇到了一些麻烦。我根据 Spark 文档使用以下选项构建了 Spark 1.6.2: build/mvn
我最近开始学习 cpp-netlib 并且正在测试一个 netlibs 示例程序 #include #include int main() { using namespace boost:
我正在考虑将 cpp netlib 用于新项目。所有示例都显示了以阻塞方式读取响应正文: client::response response_ = client_.get(request_); std
我正在尝试对我的非工作 apache spark 和 netlib 设置进行故障排除,但我不知道下一步该怎么做。 这里有一些信息: Spark 1.3.1(但也尝试过 1.5.1) 具有 3 个节点的
[已解决] 创建了从/usr/lib/lib/* 到/usr/lib* 的符号链接(symbolic link) [更新 3] 新版本: 好吧,我想我修复了一些东西 使用 find/-name "li
我正在使用 cpp-netlib (v0.11.0) 发送 HTTP 请求。 我想知道在发送 HTTP POST 请求时是否可以更改超时期限。 我正在运行一些单元测试,其中之一将 HTTP 请求发送到
我是一名优秀的程序员,十分优秀!