原文

你好,亲爱的读者!我认为你对c++中的数据结构的性能和使用有很多假设。这篇博客就是我,在摧毁你的世界。

为了充分阅读本文,如果你需要,我建议快速复习一下链表、双端队列、散列表、二叉树、B树和堆。

废话少说,开始毁灭吧!

插入和获取数据

看看下面的程序:

std::vector<std::uint64_t> v;
for(std::uint64_t i = 0; i < 10'000'000; ++i)
{v.push_back(i);
}

你可能会想“这太低效了!”

你认为如果:

  • 我们使用std::deque而不是std::vector?
  • std::list而不是std::vector?
  • std::set?
  • std:: unordered_set?

让我们测试一下性能吧!

在Xeon E5-2630 v3上,运行Windows 10,使用VS 2019:

  • std::vector:163277
  • std::deque: 695,575 us - 4X+慢
  • std::list: 1,123,685 us - 9X+较慢
  • std::set: 3,043,661 us - 18X+慢
  • std::unordered_set: 4,979,332 us - 30X+慢

不过,有一种方法可以让程序运行得更快:

std::vector<std::uint64_t> v;
v.reserve(10'000'000);
for(std::uint64_t i = 0; i < 10'000'000; ++i)
{v.push_back(i);
}

这个实现运行在53185 us (3X+快)。如果你很好奇,保留(reserve )使得std::unordered_set会把它降到2,545,083 us,使std::unordered_setstd::set快。

在c++中只有一个上帝,它的名字是vector

为什么?为什么?为什么! !

std::vector的常见分配策略是总是重新分配现有使用量的两倍,快速减少分配的数量(渐近线为O(log n))。对于10M条目,这意味着我们可能做不到25个分配(2^24 = 16,77216)。

即使我们必须在每次重新分配时复制所有内容,数据在内存中是连续的,使复制速度超快(尽管插入新条目,也超快)。如果我们使用push_front, vector就会很糟糕,因为我们必须在每次插入时移动。

std::deque将有10M/size的块分配。std::list每个条目可能至少有一个分配,std::setstd::unordered_set也是如此。std::unordered_set有双重惩罚:需要调整数组的大小 + 分配节点。如果我们保留(reservestd::unordered_set,我们就可以战胜std::set

在此之上,std::vector只需要存储条目,deque需要在每个块之间创建链,在每个条目之间创建列表,set也是如此。unordered_set需要计算每个条目的哈希值,创建节点,并链接到该节点。

你可以使用一个特别的分配器来缓解这些问题,但是你永远无法超越std::vector的原始能力。

如果你对STL容器的基准测试感兴趣,可以参阅更深入的文章

理想的情况

最好记住你的电脑是什么样的(我说的电脑是指硬件+操作系统):

  • 连续内存区域可以从缓存中受益,然后是页局部性
  • 如果可能的话,一次又一次地敲击同一个记忆区域(持续的记忆会有所帮助)
  • 尽可能少的间接
  • 尽可能少的分支

对象的大小

应该将对象本身存储在集合中,还是将对象的指针存储在集合中?在我们的示例中,我们使用了一个64位整数(8字节),随着对象的大小增长,可能会出现性能问题。虽然选择一个不会随着增长而移动对象的容器(例如deque或链表)听起来可能比较有益,但你也可以考虑存储一个指向对象的指针(使用std::unique_ptr)。

什么是最有效的将取决于你确切的用例。

插入

要在内存结构中插入数据,你在开头看到的代码示例非常有效。追加到已存在的内存区域,即刚才写入的区域。页面在内存中是热的,地址在TLB中,缓存可以最优地完成它的工作。

你想要,尽可能地,回到这个例子。这就是为什么插入未排序的数据并对其排序通常比插入已排序的数据更好。

查找

这是理想的入口查找。你可能不喜欢它,但这是最佳性能的样子:

std::vector<std::uint64_t> v;
// stuff
// assuming size_t idx is where your entry is
auto x = v[idx];

到连续存储区域的一个间接方法。如果你最近在邻近的索引中查找一个条目,它就在缓存中。你会尽可能地让自己处于那种情况。

问题是,经常需要搜索条目,因此不知道直接索引。你可能知道线性搜索对于元素数量较少的条目更快(例如在这篇博文中解释的)。

删除

如果你想经常删除元素,vector不是你的好选择,就像在前面插入元素一样,这意味着移动元素。当你想要删除条目时,你可以通过放置一个墓碑(tombstone )而不是条目来缓解这种情况,但如果你有很多插入和删除操作,这就不适合使用vector

销毁

你是否应该关心容器的破坏速度?比你想象的更频繁。

例如,为了正确地销毁链表,你必须检查每个节点,并释放它。所以,在调用析构函数的基础上,你必须进行O(n)重分配。另一方面,vector只需要分配一个连续内存区域,因此速度非常快(你仍然需要调用每个项的析构函数)。

如果容器的寿命相对较短(例如,在函数运行期间创建),那么销毁速度就非常重要。你可以通过延长它们的生命周期(重用相同的容器)或完全使用不同的容器来减轻这种情况。

如果销毁占用了大量时间,你可能需要优化集合中元素的销毁。如果它们有一个重要的析构函数,你可能想看看使用内存竞技场(memory arena)是否有益。

延伸阅读:
内存竞技场(memory arena)就是一个大的、连续的内存块,只分配一次,然后通过分发较小的内存块来手动管理内存。

所有这些的要点通常是在你知道如何使用内存时提高性能。例如,你可能只分配和释放固定大小的块,在这种情况下,你可以编写非常高效的回收算法。通常在使用内存竞技场时,你还可以在使用完后立即释放整个竞技场,而不需要为每个小块单独调用库自由函数。当你有许多小块内存时,这可以显著减少开销。

在使用c++时,需要注意的是,如果你从一个竞技场分配对象,并且想要快速地重新分配整个竞技场,你应该考虑是否需要调用析构函数。如果是这样,这将需要在竞技场内的所有对象上手动调用它们。沿着这些路线,如果你可以只放置POD类型在你的竞技场,你将能够减少分配/回收开销到最小。

简而言之

在做任何事情之前,问自己“我可以不使用一个未排序的vector?”

现在我们解决了这个问题,让我们深入到非平凡的东西,因为,正如你可以猜到的,std::vector并不总是合适的解。

改善向量

你能做的最快的分配是使用堆栈,因为它只需要一个指令,移动堆栈指针。这就是为什么当你知道你的容器有多少条目时,你应该使用std::array而不是std::vector(或者你可以使用C数组,如果你是那种在磁带播放器上听老式嘻哈音乐的人,没有任何评判)。

一旦向量的大小超过堆栈大小的很大比例,或者当你希望移动向量时,这种方法就不那么吸引人了,因为这会妨碍有效的移动语义。

对于这个,你会说,“但是!我不知道我的向量在编译时应该有多大!”

大多数时候,你不会。但是,如果你知道在大多数时候你的向量不会超过特定的大小,那么你可以使用小向量优化。

小向量优化是将对象预先分配给一定数量的对象,并在超过该值时切换到动态内存分配。boost和folly都提供了一个实现(在QuasarDB中,我们使用Boost的实现)。

哈希表

C++ 哈希表实现

哈希表可能是仅次于数组的第二有用的数据结构。它们通过适当的哈希函数提供O(1)查找。C++附带了std::unordered_mapstd::unordered_set。如果查找是在关键路径中,那么使用好的散列函数可以极大地受益于散列映射。

也就是说,如果哈希表真的在性能路径中,那么你很快就会发现std::unordered_map不是很好。

这是因为该标准的编写方式使得实现是一个链表数组。这意味着,尽管查找的复杂性是O(1),但你需要执行多次内存访问(和间接访问)来访问你的条目。当哈希表查找在关键路径时,这可能会导致显著的减速。

这篇精彩的演讲将解释如何构建更好的哈希表。这篇文章展示了现有散列表实现的一个基准。

记住一件重要的事。目前,高效的哈希表实现通常将对象存储在数组中,以节省一个间接操作并提高缓存效率。随着对象的大小增加,将其存储在节点中变得更加有效,从而加快数组的重新排列。据此衡量和决定。

在QuasarDB,我们目前使用:

  • tbb::concurrent_hash_map,当需要并发读写时
  • 其他情况下为robin_hood::unordered_map
  • std::unordered_map在尚未更新的遗留代码中

有效利用哈希表

哈希表最初不是C++标准的一部分,因为它们有一定数量的注意事项。如果你不知道它们,O(1)查找可以变成O(n)查找。

哈希函数的重要性

你的哈希(hash)函数需要快速并提供很大的离散度。碰撞对于散列映射来说是不好的,因为它们强制对每个碰撞进行额外的比较。因此,你希望确保不同的条目具有不同的散列。对于整型,哈希函数很简单。对于字符串,Murmurhash或 Farmhash是很好的。

但是,对于组合类型,有一个问题。

让我们看看这个结构

struct my_struct
{std::string a;std::string b;
};

假设你使用了一个很好的哈希函数,例如farmhash。你可以这样构建一个自定义哈希函数:

template <>
std::hash<my_struct>
{size_t operator()(const my_struct & v) const noexcept{return farmhash::hash(v.a) ^ farmhash::hash(v.b);}
};

你用异或来最大化熵,但有个问题。异或是可交换的,这意味着操作的顺序不会改变结果。此外,如果两个哈希值相等,则该值将为零,从而放大冲突。

换句话说,my_struct{"a", "b"}my_struct{"b", "a"}将产生相同的哈希值,造成冲突,减慢查找速度。

这就是为什么应该正确地构造哈希函数。例如,可以使用boost::hash_combine()。在QuasarDB中,我们有一个等价的函数,使用constexpr:

template <class Integer>
constexpr std::size_t hash_combine(std::size_t seed, Integer v) noexcept
{return seed ^ ((static_cast<std::size_t>(v) + std::size_t{0x9e3779b9}) + (seed << std::size_t{6}) + (seed >> std::size_t{2}));
}

对于字符串和blob,我们使用farmhash,并为任何其他类型使用自定义hash函数。

储备!
哈希表是一个桶数组,插入新条目,调整这个数组的大小。这就是为什么强烈建议将哈希映射保留到你期望它能够容纳的最大桶数(假设你的哈希函数能够做到这一点:一个桶 = 一个条目)。这样,你就不必在插入新条目时支付重新分配的费用。

什么时候确实需要对数据进行排序

有序还是无序?

有序数据是大量数据处理的必要条件。我总是惊讶于有多少软件工程问题最终归结为排序问题。

需要对数据进行排序的示例:删除集合中的重复数据、数据分析标准(例如,低于/高于…的数据)、基于阈值对数据进行分区,等等。

如果你需要对容器中的数据进行排序,那么尽早确定这一点非常重要,因为排序数据将限制你对数据结构的选择。同样,我们倾向于高估我们对有序数据的需求。当需要对数据进行排序时,对其进行排序可能比一直保持其排序更有效。

我的建议是:

  • 确保临时排序并不适合你的情况
  • 如果这还不够,那么对于你的用例来说,堆可能是一种很好的数据结构
  • 对于单一性问题,考虑一个哈希表
  • 该死的!看起来你确实需要一个排序的数据容器

std::map,平均执行者

在c++ 11之前,唯一可用的“官方”关联容器是std::map,它是有序的。如果需要对数据进行排序,可以使用std::mapstd::set。但是,只有在有序数据足以解决问题(性能或其他)时,才应该使用它们。

这些容器实现为二叉树,因此在每次插入时都需要分配一个节点,并且具有非常不友好的缓存查找。

公平地说,std::map有一个稳固的优势:它在所有方面都表现不错。它没有std::unordered_map所具有的警告。对于std::multimap,你可以拥有具有类似键的条目,这非常有用。由于C++ 17,你还可以提取节点,将它们附加到另一个std::map,从而可以构建临时映射并合并它们。

那么,你应该使用std::map吗?

是的,如果:

  • 代码不是性能关键的,你需要一个排序的容器
  • 你不希望依赖于第三方库

如果是其他情况,请继续阅读。

排序向量

我最喜欢的结构是排序向量。Boost有flat_map和flat_set(以及flat_multimap和flat_multiset)。

一个排序的向量是如何工作的?与将项目存储在二叉树的节点上不同(与映射不同),这些项目存储在一个向量中,并根据预定义的标准进行排序。查找是使用复杂度为O(log n)的二进制搜索来执行的。

理论上,排序向量和二叉树的速度一样快,实际上可能更快,因为:

  • 内存是连续的,这使得结构对缓存非常友好。
  • 销毁容器几乎没有任何开销(与需要删除每个节点的映射相反)
  • 你可以在一个向量中插入n个元素,然后对这个向量排序,而不是做n个排序的插入
  • 你可以给出插入提示,例如,当你知道你从一个排序源插入时,它从O(log n)插入移动到O(1)
  • 你可以预先分配你的排序向量

换句话说,排序后的向量可以将你带回我们在顶部描述的理想插入用例。

根据我的经验,一个有序的向量只是压缩了一棵二叉树。大多数时候……

问题是什么?

问题是,如果你不能插入(几乎)有序的数据,并且不能缓冲插入,那么每次插入都将迫使你移动现有的条目,从而导致糟糕的插入性能。

但不用担心,因为我们可以做得更好。

B树

二叉树的问题是一个元素与树下的另外两个元素相连接。这意味着每个条目对应一个节点: 每次插入一个分配,糟糕的局域性。如果使用B-Tree而不是二叉树,则每个节点可以有几个子节点,从而最小化开销,并使数据结构对缓存更加友好。

谷歌的Abseil有一个很好的兼容c++ 17的B-Tree实现。

在QuasarDB,我们是排序向量的忠实粉丝,并广泛地使用它们。我们目前没有使用B-Tree,因为我们还没有遇到过用已排序的向量或未排序的数据结构都无法解决的情况。

我们没有谈论过的结构

在这篇文章的开头,我们似乎已经摧毁了std::liststd::deque。不要被这个基准愚弄了,这些结构非常有用。

展示他们应得的爱

当你在编程方面有了更多的经验后,你可能会和本文一样认为链表是无用的。

他们不是。一旦你理解了链表隐藏的强大功能,它就是一种非常有用的数据结构: 除了指向已删除元素的迭代器外,链表永远不会使迭代器失效。

因此,你可以安全地使用迭代器作为现有对象的代理,例如,链表成为LRU缓存的一个很好的数据结构(通常实现为哈希映射+链表)。相信我,随着软件项目的发展,这个项目至少有一个缓存的概率收敛为1。

list是一个双链表,这意味着每个元素都指向它的前身和继承者。如果只需要在单个方向遍历列表,可以使用std::list

什么时候使用deque?

我们在基准测试中看到,vector在末尾插入时的性能优于deque。而你认为deque是最适合这种情况的!

不完全是。当你需要在容器的末尾和开头插入(或删除)时,deque非常有用。另外,当只在开始和结束插入时,deque不会使迭代器失效。

尽管deque为访问提供了O(1)渐近性能,但大约比std::vector低两倍,因为每次访问都需要两个指针解引用,而不是一个。

但是记住,在任何事情上都很难打败vector。这是C++的标准普尔500指数。

你可以从中推断出指导方针

那么结论是什么呢?

  • 默认为std::vector,如果你能在编译时知道大小,使用std::array
  • 如果真的需要对数据进行排序,可以使用排序向量或 B-Tree
  • 如果需要快速查找,可以使用哈希表,但要避开哈希函数和std::unordered_map的限制

作为额外的奖励,这是我们在 QuasarDB 使用的决策图。它是不完整的(它不可能是),因为它不包括非常特殊的情况,你可能想要链表,deque,前缀树,等等。

container flow
目标是用正确的问题帮助你走在正确的方向上。

像往常一样:猜想,测量,推断,决定!

就在最近,我花了很多时间尝试并击败(我自己的)基于节点向量(vector of nodes)的ustrings实现。其中节点是hash + uniq_ptr…包括一些众所周知的C库,它们是最快的解决方案。那真是个惊喜。
其余的在这里:https://github.com/dbj-data/dbj-bench/tree/master/source/benches/string_pool_comparing

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. VSCode无法显示Unity代码提示的解决办法

    VSCode无法显示Unity代码提示的解决办法 不提示的原因&#xff1a; 没有指定正确的sln工程配置文件系统中没有安装对应的.NET开发者版本 解决办法&#xff1a; 检查对应的.NET开发者版本 打开VSCode工程目录下的Assembly-CSharp.csproj文件 找到Project —> PropertyGro…...

    2024/4/14 22:56:18
  2. 数据库基本概念、DBMS、DBS

    文章目录一、什么是数据库技术二、数据库基础1、什么是SQL&#xff1f;2、数据&#xff08;Data&#xff09;3、数据库&#xff08;**Database**&#xff09;4、数据库管理系统&#xff08;**DBMS**&#xff09;5、数据库系统&#xff08;DBS&#xff09;一、什么是数据库技术 …...

    2024/4/19 23:37:54
  3. MySQL查询语句的执行情况

    文章目录1、MySQL基本结构1.1、Server层1.2、存储引擎2、MySQL中的组件2.1、连接器2.2、查询缓存2.3、分析器2.4、优化器2.5、执行器学习来源1、MySQL基本结构 可以分为Server层和存储引擎两个部分 1.1、Server层 Server层包括连接器、查询缓存、分析器、优化器、执行器等。…...

    2024/4/14 22:56:38
  4. 泛型的概述、类别及注意事项

    一、泛型概述 泛型指的是“参数化类型” 即把某些参数的数据类型使用一个泛型代替&#xff0c;在使用或调用的时候传入具体的数据类型赋值给泛型使用方式 泛型定义在尖括号中&#xff0c;可以同时定义多种泛型&#xff0c;使用逗号隔开 如<T>、<T,V> 二、泛型的类…...

    2024/4/14 22:57:04
  5. 如何靠球鞋护理赚到第一个10w

    如何在2016大学毕业半年内&#xff0c;赚到第一个十万&#xff0c;有机会赚百万&#xff0c;又是怎么失去了这笔生意? 这个项目在部分地区仍然是一个具有发展潜力的项目。 现在sneaker&#xff08;球鞋&#xff09;文化可能大家都熟知了&#xff0c;资本已经让这个文化变成了…...

    2024/4/14 22:57:29
  6. OpenCV 函数学习07-图像的创建

    7. 图像的创建 OpenCV 中图像对象的数据结构是 ndarray 多维数组&#xff0c;因此可以用 Numpy 创建多维数组来生成图像。特别对于空白、黑色、白色、随机等特殊图像&#xff0c;用 Numpy 创建图像非常方便。 Numpy 可以使用 np.zeros() 等方法创建指定大小、类型的图像对象&…...

    2024/4/5 5:48:57
  7. 毕业设计-基于Springboot实现共享自习室管理系统

    项目编号&#xff1a;BS-XX-083 项目介绍 项目主要功能包括&#xff1a; 数据分析&#xff1a;柱状图分析、折线图分析、统计数据等&#xff0c;每10秒自动刷新 用户管理&#xff1a;用户信息管理、用户投诉管理、投诉反馈信息、黑名单管理&#xff1b; 座位管理&#xff1a;…...

    2024/4/14 22:57:19
  8. 从零教你使用Maven,从此项目打包不用愁

    文章目录一、主要内容二、Maven的简介2.1. 简介2.2. 项⽬构建2.3. 项⽬构建⼯具2.4. Maven的四⼤特性2.4.1. 依赖管理系统2.4.2. 多模块构建2.4.3. ⼀致的项⽬结构2.4.4. ⼀致的构建模型和插件机制三、Maven的安装配置和⽬录结构3.1. Maven的安装配置3.1.1. 检查JDK的版本3.1.2…...

    2024/4/18 3:33:50
  9. 数据库期末复习:填空题汇总

    1.关系数据模型由关系数据结构、关系操作和关系完整性约束三部分组成。 2.一般情况下&#xff0c;当对关系R和S使用自然连接时&#xff0c;要求R和S含有一个或多个共有的属性。 3.在Student表的Sname列上建立一个唯一索引的SQL语句为&#xff1a;CREATE UNIQUE INDEX Stusname …...

    2024/4/14 22:57:29
  10. Java开发零基础篇:day05 方法

    方法 之前讲解的循环操作&#xff0c;可以解决的是代码重复的问题&#xff0c;但是此时的重复的代码必须是有规律的。那循环操作&#xff0c;能解决所有的代码重复吗&#xff1f;答案肯定是不行的&#xff0c;比如针对于某一种功能的重复操作&#xff0c;循环解决不 了&#x…...

    2024/4/20 4:54:50
  11. V by one传输lane的数量怎么确定

    V by one 目前最高传输速率是3.75Gbps/lane 如果是传输4K60Hz&#xff0c; 总数据量H total * V total *3*刷新率*比特数*1.25 分辨率3840*2160&#xff0c;计算数据量时H total 4400&#xff0c;V total 2250 由于每个像素有三个亚像素&#xff08;R、G、B&#xff09;&am…...

    2024/4/15 16:08:47
  12. Java——将一组数据固定分组,每组n个元素

    /*** 将一组数据固定分组&#xff0c;每组n个元素** param source 要分组的数据源* param limit 每组n个元素* param <T>* return*/public static <T> List<List<T>> fixedGroup(List<T> source, int limit) {if (null source || source.s…...

    2024/4/18 18:19:41
  13. CGBTN2108-DAY06总结复习

    文章目录1. 面向过程2.面向对象3.类4.对象5.类与对象的关系6. 对象创建过程分析7. 封装7.1 封装属性7.2 封装方法1. 面向过程 面向过程也是一种编程思想&#xff0c;这种思想&#xff0c;强调凡事要亲力亲为&#xff0c;每一步都是自己来做 2.面向对象 Java是一门面向对象的…...

    2024/4/20 8:32:08
  14. Eclipse中的mybatis中mapper.xml文件标签没有提示的(解决方法)

    Mybatis的mapper.xml 映射文件没有提示&#xff1f; 1、先来看一下Mapper.xml的头文件 ——1-1、从标文件中可以看到标黄的是Mapper.xml的命名空间&#xff0c;不提示就是该网络的地址获取不到信息 或 没有配置目录的mybatis-3-mapper.dtd <?xml version"1.0" …...

    2024/4/14 22:57:24
  15. SpringBoot调用支付宝开发者平台支付接口

    文章目录环境准备现在所有的环境都是使用支付宝开发者平台提供的沙箱环境1.访问https://openhome.alipay.com/platform/appDaily.htm?tabinfo 手机扫描登录 填写资料 2.配置支付密匙详细信息 显示如下&#xff1a; 2.1 首先点击 RSA2(SHA256)密钥 设置 2.2 点击公钥 2.3 根据你…...

    2024/4/14 22:57:24
  16. uni-app 93 群聊列表分页(一)

    router.js // 群聊列表router.get(/group/:page,controller.group.list);app/controller/group.js // 获取群里列表async list(){const { ctx,app } this;let current_user_id ctx.authUser.id;let page ctx.params.page ? parseInt(ctx.params.page) : 1;let limit ctx.q…...

    2024/4/25 4:33:08
  17. 10.外观模式

    引入 外观模式又称为门面模式。 在阎宏博士的《JAVA与模式》一书中开头是这样描述门面&#xff08;Facade&#xff09;模式的&#xff1a; 门面模式是对象的结构模式&#xff0c;外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口&#x…...

    2024/4/17 9:38:10
  18. Weisfeiler-Lehman Test

    Weisfeiler-Lehman Test算法定义与定理示例算法 定义与定理 定义&#xff1a; &#xff08;1&#xff09;图&#xff1a; &#xff08;2&#xff09;图序列&#xff1a; &#xff08;3&#xff09;第h次迭代的某个图核k的WL图核&#xff1a; {G0&#xff0c;…&#xff0c…...

    2024/4/7 2:34:33
  19. 用浏览器打开网址

    用浏览器打开网址 try {for (int i 0; i < list.size(); i) {String url "www.baidu.com";url list.get(i);if (java.awt.Desktop.isDesktopSupported()) {//创建一个URI实例,注意不是URLjava.net.URI uri java.net.URI.create(url);//获取当前系统桌面扩展ja…...

    2024/4/14 22:57:24
  20. 11.桥接模式

    引入 在阎宏博士的《JAVA与模式》一书中开头是这样描述桥梁&#xff08;Bridge&#xff09;模式的&#xff1a; 桥梁模式是对象的结构模式。又称为柄体(Handle and Body)模式或接口(Interface)模式。桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦&am…...

    2024/4/14 22:57:34

最新文章

  1. 在进行YOLOv3模型部署时,如何评估和选择最适合的硬件平台?

    在进行YOLOv3模型部署时&#xff0c;评估和选择最适合的硬件平台通常涉及以下几个关键因素&#xff1a; 1. 模型复杂度和性能需求&#xff1a;YOLOv3模型的复杂度较高&#xff0c;特别是使用更深的网络结构时。需要选择能够满足模型计算需求的硬件平台。 2. 实时性要求&#…...

    2024/5/3 18:45:00
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. axios拦截器:每次请求自动带上 token

    Step 1&#xff1a;创建Axios实例并添加拦截器 在你的Vue项目中&#xff0c;一般我们会先导入axios&#xff0c;然后创建一个axios实例。这样做是为了方便统一管理和配置。 import axios from axios; // 引入axios// 创建一个axios实例 const service axios.create();// 添加请…...

    2024/4/30 17:13:59
  4. 多态--下

    文章目录 概念多态如何实现的指向谁调谁&#xff1f;例子分析 含有虚函数类的大小是多少&#xff1f;虚函数地址虚表地址多继承的子类的大小怎么计算&#xff1f;练习题虚函数和虚继承 概念 优先使用组合、而不是继承; 继承会破坏父类的封装、因为子类也可以调用到父类的函数;…...

    2024/5/1 8:29:57
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/2 16:16:39
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/2 9:28:15
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/2 15:04:34
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/2 9:07:46
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57