在 32 位系统上使用 int64_t 而不是 int32_t 对性能有何影响?

2024-01-12

我们的 C++ 库当前使用 time_t 来存储时间值。我开始在某些地方需要亚秒级精度,因此无论如何,那里都需要更大的数据类型。此外,在某些地方解决 2038 年问题可能会很有用。因此,我正在考虑完全切换到具有底层 int64_t 值的单个 Time 类,以替换所有位置的 time_t 值。

现在我想知道在 32 位操作系统或 32 位 CPU 上运行此代码时这种更改对性能的影响。 IIUC 编译器将生成代码以使用 32 位寄存器执行 64 位算术。但如果这太慢,我可能不得不使用更差异化的方式来处理时间值,这可能会使软件更难以维护。

我感兴趣的是:

  • 哪些因素影响这些操作的性能?可能是编译器和编译器版本;但操作系统或 CPU 品牌/型号也会影响这一点吗?普通的 32 位系统会使用现代 CPU 的 64 位寄存器吗?
  • 在 32 位上模拟时哪些操作会特别慢?或者哪个几乎不会减速?
  • 在 32 位系统上使用 int64_t/uint64_t 是否有任何现有的基准测试结果?
  • 有人对这种性能影响有自己的经验吗?

我最感兴趣的是 Intel Core 2 系统上 Linux 2.6(RHEL5、RHEL6)上的 g++ 4.1 和 4.4;但了解其他系统(如 Sparc Solaris + Solaris CC、Windows + MSVC)的情况也很好。


哪些因素影响这些操作的性能?大概是 编译器和编译器版本;但操作系统或 CPU 品牌/型号也会影响这个吗?

主要是处理器架构(和模型 - 请阅读我在本节中提到处理器架构的模型)。编译器可能会产生一些影响,但大多数编译器在这方面做得很好,因此处理器架构的影响会比编译器更大。

操作系统不会产生任何影响(除了在某些情况下“如果您更改操作系统,您需要使用不同类型的编译器来更改编译器的功能”之外 - 但这可能是一个很小的影响)。

普通的 32 位系统会使用现代 CPU 的 64 位寄存器吗?

这不可能。如果系统处于 32 位模式,它将充当 32 位系统,寄存器的额外 32 位是完全不可见的,就像系统实际上是“真正的 32 位系统”一样。

在 32 位上模拟时哪些操作会特别慢?或者哪个几乎不会减速?

加法和减法更糟糕,因为它们必须按两个操作的顺序完成,而第二个操作需要第一个操作完成 - 如果编译器只是对独立数据生成两个加法操作,则情况并非如此。

如果输入参数实际上是 64 位,乘法会变得更糟 - 例如,2^35 * 83 比 2^31 * 2^31 更糟糕。这是因为处理器可以很好地将 32 x 32 位乘法生成 64 位结果 - 大约 5-10 个时钟周期。但是 64 x 64 位乘法需要相当多的额外代码,因此需要更长的时间。

除法是一个与乘法类似的问题 - 但这里可以在一侧获取 64 位输入,将其除以 32 位值并得到 32 位值。由于很难预测何时会起作用,因此 64 位除法可能几乎总是很慢。

数据还将占用两倍的缓存空间,这可能会影响结果。类似的结果是,一般分配和传递数据将花费至少两倍的时间,因为要操作的数据是两倍。

编译器还需要使用更多寄存器。

在 32 位系统上使用 int64_t/uint64_t 是否有任何现有的基准测试结果?

可能吧,但我不知道。即使有,它对您来说也只会有一定的意义,因为操作的混合对于操作的速度非常关键。

如果性能是应用程序的重要组成部分,请对您的代码(或其某些代表性部分)进行基准测试。如果您的代码在相同情况下速度慢或快一些完全不同的量,那么 Benchmark X 给出的结果慢 5%、25% 或 103% 并不重要。

有人对这种性能影响有自己的经验吗?

我重新编译了一些针对 64 位体系结构使用 64 位整数的代码,发现性能有了相当大的提高 - 某些代码位的性能提高了 25%。

将您的操作系统更改为同一操作系统的 64 位版本,也许会有帮助?

Edit:

因为我喜欢找出这些事情的区别,所以我编写了一些代码,并使用了一些原始模板(仍在学习这一点 - 模板并不完全是我最热门的主题,我必须说 - 给我位摆弄和指针算术,我(通常)会做对......)

这是我编写的代码,试图复制一些常见的功能:

#include <iostream>
#include <cstdint>
#include <ctime>

using namespace std;

static __inline__ uint64_t rdtsc(void)
{
    unsigned hi, lo;
    __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
    return ( (uint64_t)lo)|( ((uint64_t)hi)<<32 );
}

template<typename T>
static T add_numbers(const T *v, const int size)
{
    T sum = 0;
    for(int i = 0; i < size; i++)
    sum += v[i];
    return sum;
}


template<typename T, const int size>
static T add_matrix(const T v[size][size])
{
    T sum[size] = {};
    for(int i = 0; i < size; i++)
    {
    for(int j = 0; j < size; j++)
        sum[i] += v[i][j];
    }
    T tsum=0;
    for(int i = 0; i < size; i++)
    tsum += sum[i];
    return tsum;
}



template<typename T>
static T add_mul_numbers(const T *v, const T mul, const int size)
{
    T sum = 0;
    for(int i = 0; i < size; i++)
    sum += v[i] * mul;
    return sum;
}

template<typename T>
static T add_div_numbers(const T *v, const T mul, const int size)
{
    T sum = 0;
    for(int i = 0; i < size; i++)
    sum += v[i] / mul;
    return sum;
}


template<typename T> 
void fill_array(T *v, const int size)
{
    for(int i = 0; i < size; i++)
    v[i] = i;
}

template<typename T, const int size> 
void fill_array(T v[size][size])
{
    for(int i = 0; i < size; i++)
    for(int j = 0; j < size; j++)
        v[i][j] = i + size * j;
}




uint32_t bench_add_numbers(const uint32_t v[], const int size)
{
    uint32_t res = add_numbers(v, size);
    return res;
}

uint64_t bench_add_numbers(const uint64_t v[], const int size)
{
    uint64_t res = add_numbers(v, size);
    return res;
}

uint32_t bench_add_mul_numbers(const uint32_t v[], const int size)
{
    const uint32_t c = 7;
    uint32_t res = add_mul_numbers(v, c, size);
    return res;
}

uint64_t bench_add_mul_numbers(const uint64_t v[], const int size)
{
    const uint64_t c = 7;
    uint64_t res = add_mul_numbers(v, c, size);
    return res;
}

uint32_t bench_add_div_numbers(const uint32_t v[], const int size)
{
    const uint32_t c = 7;
    uint32_t res = add_div_numbers(v, c, size);
    return res;
}

uint64_t bench_add_div_numbers(const uint64_t v[], const int size)
{
    const uint64_t c = 7;
    uint64_t res = add_div_numbers(v, c, size);
    return res;
}


template<const int size>
uint32_t bench_matrix(const uint32_t v[size][size])
{
    uint32_t res = add_matrix(v);
    return res;
}
template<const int size>
uint64_t bench_matrix(const uint64_t v[size][size])
{
    uint64_t res = add_matrix(v);
    return res;
}


template<typename T>
void runbench(T (*func)(const T *v, const int size), const char *name, T *v, const int size)
{
    fill_array(v, size);

    uint64_t long t = rdtsc();
    T res = func(v, size);
    t = rdtsc() - t;
    cout << "result = " << res << endl;
    cout << name << " time in clocks " << dec << t  << endl;
}

template<typename T, const int size>
void runbench2(T (*func)(const T v[size][size]), const char *name, T v[size][size])
{
    fill_array(v);

    uint64_t long t = rdtsc();
    T res = func(v);
    t = rdtsc() - t;
    cout << "result = " << res << endl;
    cout << name << " time in clocks " << dec << t  << endl;
}


int main()
{
    // spin up CPU to full speed...
    time_t t = time(NULL);
    while(t == time(NULL)) ;

    const int vsize=10000;

    uint32_t v32[vsize];
    uint64_t v64[vsize];

    uint32_t m32[100][100];
    uint64_t m64[100][100];


    runbench(bench_add_numbers, "Add 32", v32, vsize);
    runbench(bench_add_numbers, "Add 64", v64, vsize);

    runbench(bench_add_mul_numbers, "Add Mul 32", v32, vsize);
    runbench(bench_add_mul_numbers, "Add Mul 64", v64, vsize);

    runbench(bench_add_div_numbers, "Add Div 32", v32, vsize);
    runbench(bench_add_div_numbers, "Add Div 64", v64, vsize);

    runbench2(bench_matrix, "Matrix 32", m32);
    runbench2(bench_matrix, "Matrix 64", m64);
}

编译为:

g++ -Wall -m32 -O3 -o 32vs64 32vs64.cpp -std=c++0x

结果是:注:请参阅下面的 2016 年结果- 由于 64 位模式下 SSE 指令的使用情况存在差异,因此这些结果略显乐观,但 32 位模式下没有 SSE 使用情况。

result = 49995000
Add 32 time in clocks 20784
result = 49995000
Add 64 time in clocks 30358
result = 349965000
Add Mul 32 time in clocks 30182
result = 349965000
Add Mul 64 time in clocks 79081
result = 7137858
Add Div 32 time in clocks 60167
result = 7137858
Add Div 64 time in clocks 457116
result = 49995000
Matrix 32 time in clocks 22831
result = 49995000
Matrix 64 time in clocks 23823

正如您所看到的,加法和乘法并没有那么糟糕。分裂变得非常糟糕。有趣的是,矩阵相加根本没有太大区别。

在 64 位上速度更快吗?我听到有些人问: 使用相同的编译器选项,只需 -m64 而不是 -m32 - 是的,速度更快:

result = 49995000
Add 32 time in clocks 8366
result = 49995000
Add 64 time in clocks 16188
result = 349965000
Add Mul 32 time in clocks 15943
result = 349965000
Add Mul 64 time in clocks 35828
result = 7137858
Add Div 32 time in clocks 50176
result = 7137858
Add Div 64 time in clocks 50472
result = 49995000
Matrix 32 time in clocks 12294
result = 49995000
Matrix 64 time in clocks 14733

2016年编辑、更新: 编译器的 32 位和 64 位模式下的四种变体,带或不带 SSE。

这些天我通常使用 clang++ 作为我常用的编译器。我尝试使用 g++ 进行编译(但它仍然是与上面不同的版本,因为我已经更新了我的机器 - 而且我也有不同的 CPU)。由于 g++ 无法编译 64 位的 no-sse 版本,所以我没有看到这一点。 (无论如何,g++ 给出类似的结果)

作为一个短表:

Test name      | no-sse 32 | no-sse 64 | sse 32 | sse 64 |
----------------------------------------------------------
Add uint32_t   |   20837   |   10221   |   3701 |   3017 |
----------------------------------------------------------
Add uint64_t   |   18633   |   11270   |   9328 |   9180 |
----------------------------------------------------------
Add Mul 32     |   26785   |   18342   |  11510 |  11562 |
----------------------------------------------------------
Add Mul 64     |   44701   |   17693   |  29213 |  16159 |
----------------------------------------------------------
Add Div 32     |   44570   |   47695   |  17713 |  17523 |
----------------------------------------------------------
Add Div 64     |  405258   |   52875   | 405150 |  47043 |
----------------------------------------------------------
Matrix 32      |   41470   |   15811   |  21542 |   8622 |
----------------------------------------------------------
Matrix 64      |   22184   |   15168   |  13757 |  12448 |

带有编译选项的完整结果。

$ clang++ -m32 -mno-sse 32vs64.cpp --std=c++11 -O2
$ ./a.out
result = 49995000
Add 32 time in clocks 20837
result = 49995000
Add 64 time in clocks 18633
result = 349965000
Add Mul 32 time in clocks 26785
result = 349965000
Add Mul 64 time in clocks 44701
result = 7137858
Add Div 32 time in clocks 44570
result = 7137858
Add Div 64 time in clocks 405258
result = 49995000
Matrix 32 time in clocks 41470
result = 49995000
Matrix 64 time in clocks 22184

$ clang++ -m32 -msse 32vs64.cpp --std=c++11 -O2
$ ./a.out
result = 49995000
Add 32 time in clocks 3701
result = 49995000
Add 64 time in clocks 9328
result = 349965000
Add Mul 32 time in clocks 11510
result = 349965000
Add Mul 64 time in clocks 29213
result = 7137858
Add Div 32 time in clocks 17713
result = 7137858
Add Div 64 time in clocks 405150
result = 49995000
Matrix 32 time in clocks 21542
result = 49995000
Matrix 64 time in clocks 13757


$ clang++ -m64 -msse 32vs64.cpp --std=c++11 -O2
$ ./a.out
result = 49995000
Add 32 time in clocks 3017
result = 49995000
Add 64 time in clocks 9180
result = 349965000
Add Mul 32 time in clocks 11562
result = 349965000
Add Mul 64 time in clocks 16159
result = 7137858
Add Div 32 time in clocks 17523
result = 7137858
Add Div 64 time in clocks 47043
result = 49995000
Matrix 32 time in clocks 8622
result = 49995000
Matrix 64 time in clocks 12448


$ clang++ -m64 -mno-sse 32vs64.cpp --std=c++11 -O2
$ ./a.out
result = 49995000
Add 32 time in clocks 10221
result = 49995000
Add 64 time in clocks 11270
result = 349965000
Add Mul 32 time in clocks 18342
result = 349965000
Add Mul 64 time in clocks 17693
result = 7137858
Add Div 32 time in clocks 47695
result = 7137858
Add Div 64 time in clocks 52875
result = 49995000
Matrix 32 time in clocks 15811
result = 49995000
Matrix 64 time in clocks 15168
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 32 位系统上使用 int64_t 而不是 int32_t 对性能有何影响? 的相关文章

  • 从 Dropbox C# 下载文件[重复]

    这个问题在这里已经有答案了 我正在尝试下载 Dropbox 中的 pdf 文件 我需要将其保存到本地计算机中 可以是任何文件夹C Users User Desktop例如 这是我一直在使用的代码 public void DownloadPd
  • 在列表中查找匹配项的最简洁方法

    在列表中查找内容的最佳方式是什么 我知道 LINQ 有一些不错的技巧 但我们也可以获取有关 C 2 0 的建议 让我们对这个常见的代码模式进行最佳重构 目前我使用这样的代码 mObjList is a List
  • 在 C++ 中,std::string::push_back() 的摊余复杂度是 O(1) 吗?

    我知道标准指定它适用于向量 但是字符串呢 是的 它是摊销常数时间 请参见第 716 页的表 101本文件的 http www open std org jtc1 sc22 wg21 docs papers 2012 n3485 pdf 表
  • 如何将异常对象序列化为 xml 字符串

    我想要类似的东西 try code here catch Exception ex stringXML Exception toXML 这样 stringXML 的值就是
  • 为什么不能使用initializer_list来初始化unique_ptr的向量? [复制]

    这个问题在这里已经有答案了 我想知道为什么initializer list 不能与unique ptr 一起使用 std vector
  • 使用 pthread_cond_signal 优雅地终止线程被证明是有问题的

    我需要发射一堆线程 并希望优雅地将它们拉下来 我正在尝试使用pthread cond signal pthread cond wait实现这一目标 但遇到了问题 这是我的代码 首先是thread main static void thrma
  • 是否可以获取指向装箱非托管值类型的指针?

    是否可以获取指向装箱非托管值类型的指针 而无需编写对每个支持的类型进行强制转换的大型 switch 语句 就像是 object val Contains a boxed unmanaged value such as int long by
  • 为什么 .Net 框架指南建议您不要使用 ref/out 参数?

    显然 他们很 混乱 这是认真的原因吗 你还能想到其他的吗 你见过有多少开发人员并不真正理解 ref out 吗 我在真正需要的地方使用它们 但在其他地方则不然 它们通常仅在您想有效返回两个或多个值时才有用 在这种情况下它至少值得thinki
  • 使用 C# 和 .NET Core 在 AWS Cognito 用户池中进行用户管理

    如何使用 C 和 NET Core 3 x 管理 AWS Cognito 用户池中的用户 在文档中找不到有关它的任何内容 Attilio Gelosa 的原创文章 我写这篇文章是希望对其他人有帮助 我必须阅读一页又一页的文档 并从 AWS
  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • Ajax 函数在重定向后不保存滚动位置

    正如标题所述 我编写了一个 ajax 函数 该函数应该滚动到用户在重定向之前所在的位置 我写了一个alert对于测试场景 它确实触发了 但滚动不断回到顶部 我在这里做错了什么 JavaScript ajax type GET url Adm
  • 不可能的事情发生了!这是什么意思?

    我遇到了一个有趣的运行时错误 我认为这是某种内存泄漏 我写了以下程序 C Code include
  • 验证域用户凭据

    我需要一种方法来验证 Windows 上本机 C 的用户 密码对 输入的是用户名和密码 用户可以是 DOMAIN user 格式 基本上我需要编写一个函数 如果用户 密码是有效的本地帐户 则返回 true 第1部分 如果用户 密码在给定的域
  • C# 或 Windows 相当于 OS X 的 Core Data?

    我迟到了 现在才开始在 OS X Cocoa 中使用 Core Data 它令人难以置信 并且确实改变了我看待事物的方式 C 或现代 Windows 框架中是否有等效的技术 即拥有可免费保存 数据管理 删除 搜索的托管数据类型 还想知道Li
  • std::iota 的 iota 代表什么?

    我假设 i 是增量 a 是分配 但我无法弄清楚或找到答案 而且 它看起来与非标准非常相似itoa我认为这很令人困惑 C iota is not an acronym or an initialism It is the word iota
  • C 中函数“fgets”的参数太少

    每当我编译这个错误时 我都会收到该错误 但我不知道为什么 我直接从书上抄袭这个 有人可以帮忙吗 include
  • 您的 C++ 程序中是否仍然存在内存分配失败问题 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在为公司写一些指导方针 我需要回答一些棘手的问题 这一项是相当困难的 解决方案可以是 根本不跟踪 确保使用 new 分配对象 这会在分配失败
  • 在标准 C 中将 int 转换为 string

    我是 C 新手 我正在寻找一个可以调用函数进行转换的示例int串起来 我发现itoa但这不是标准 C 的一部分 我还发现sprintf str d aInt 但问题是我不知道所需的 str 的大小 因此 我如何传递输出字符串的正确大小 有多
  • WPF DataGrid 选定项

    我有一个 DataGrid 用户可以通过在最后一行输入数据来添加项目 我还有一个按钮可以删除当前选定的项目 但是 当选择最后一行 空 用于添加新项目 时 最后选定的项目将保留在 SelectedItem 中 因此 如果我打开窗口 选择最后一
  • 使用 Crypto++ 和 .NET 的 CFB 模式下的 TripleDES

    我正在尝试使用 TripleDES 使用 C 应用程序获得相同的结果 该应用程序具有Crypto https www cryptopp com 和 NET应用程序使用三重DESCryptoServiceProvider https msdn

随机推荐

  • Matlab 中 += 相当于什么?

    在Matlab中是否可以增加变量的值而不在语句的右侧重新声明它 AFAIK MATLAB 中没有这样的东西 这是可以理解的 http groups google com group comp soft sys matlab browse f
  • ForEach-Object -Parallel 参数集无法解析

    使用 powershell 并执行以下操作时本文 https devblogs microsoft com powershell powershell foreach object parallel feature 运行以下示例会引发错误
  • ColdFusion 并从 MySQL 获取数据

    我正在 CF 网站上工作 需要从 MySQL 表中获取数据 我可以很好地创建 CFQuery 并检查返回的记录 但如何获取返回的记录并循环它们并从每行中的特定字段获取数据 我可以写 while if end if 等 我只是不记得如何访问数
  • 指向索引处向量的指针与迭代器

    我有一个矢量 myvec我在代码中使用它来保存内存中的对象列表 我在 正常 向量中保留一个指向当前对象的指针C时尚通过使用 Object pObj myvec index 如果 myvec 没有变得足够大以至于无法在某个过程中移动 那么这一
  • 使用 NodeJS 的 IExpress 安装后批处理未立即找到 NPM

    我正在尝试使用 iExpress 在我在 NodeJS 上创建的小脚本上安装依赖项 iExpress 包只需安装 Node 包 msiexec i node msi 然后运行安装后批处理 将 Javascript 放入 UserProfil
  • API 级别 19 上 grantUriPermission 中的 IllegalArgumentException

    下面这行代码 context getApplicationContext grantUriPermission packageName uri Intent FLAG GRANT PERSISTABLE URI PERMISSION 在 A
  • 为什么 mypy 拒绝我的“混合联合”类型声明?

    While 解决 Python 聊天中的半相关问题 https chat stackoverflow com transcript message 49920836 49920836 我在 mypy 中发现了一些我不理解的行为 from t
  • Hive 执行钩子

    我需要在 Apache Hive 中挂钩自定义执行挂钩 如果有人知道该怎么做 请告诉我 我当前使用的环境如下 Hadoop Cloudera 版本 4 1 2 操作系统 Centos 谢谢 阿伦 有多种类型的挂钩 具体取决于您要在哪个阶段注
  • setuptools、distribution 和 pip 之间如何相互关联?

    我一直在通过 Learn Python The Hard Way 第二版 一书自学 Python 在练习 46 中 它告诉我阅读 Pip Distribute 和其他一些软件包 pip 的文档足够清楚了 它允许我安装 卸载和升级软件包 阅读
  • ConcurrentHashMap:我们可以信任它吗?

    来自ConcurrentHashMap的文档 支持完全并发检索和可调整的更新预期并发的哈希表 我们能否完全相信ConcurrentHashMap线程安全操作吗 我正在使用 ConcurrentHashMap 将键与其值进行映射 我的键值对是
  • 是否可以在不使用格式化 printf 的情况下在 java 中进行精确转换? [复制]

    这个问题在这里已经有答案了 该行产生双值3 33333333335 System out println Average marks of name double sum 3 是否可以设置精度宽度 您可以使用DecimalFormat or
  • Glass 上的 Google Play 服务“不真实”

    我正在尝试获取用户在 Glass 上的当前位置 Calling mLocationClient connect 失败而没有任何解决方案 然后我检查了设备上是否可以使用 Google Play 服务 GooglePlayServicesUti
  • ASP.NET Core集成测试在本地工作,但在生产环境中运行时抛出空引用异常

    我有一个 ASP NET Core 2 2 Razor Pages Web 应用程序 我已经为以下内容编写了一些集成测试官方指南 https learn microsoft com en us aspnet core test integr
  • 将 Intent Web url 转换为 Android Intent

    我目前在我的应用程序中集成了一个 webview webview flutter 2 0 4 以进行支付流程 不幸的是 在某些时候启动了以下网址 intent payment Intent action ch twint action TW
  • 计算 R 中前两个主成分的最快方法是什么?

    我在用princomp在 R 中执行 PCA 我的数据矩阵很大 10K x 10K 每个值最多 4 位小数 在 Xeon 2 27 GHz 处理器上大约需要 3 5 小时和大约 6 5 GB 物理内存 由于我只想要前两个组件 是否有更快的方
  • Android 5.1 上的位置权限

    我们构建并部署了一个运行完美的基于位置的购物应用程序 直到我们发现我们的应用程序由于抛出安全异常而无法在 Android 5 1 1 设备上运行 经过一番研究后 我发现 Google 创建了一种在运行时请求权限的新方法 但没有看到任何明确的
  • 为什么我不能访问 TypeScript 私有成员?

    我正在研究 TypeScript 中私有成员的实现 我发现它有点令人困惑 Intellisense 不允许访问私有成员 但在纯 JavaScript 中 一切都在那里 这让我认为 TS 没有正确实现私有成员 有什么想法吗 class Tes
  • 在一个事务中执行两个不同的查询

    我正在尝试在一个中执行两个插入查询Statement 将它们放在一笔交易中 我正在看addBatch方法 但如果我理解正确的话 它可以与单个PreparedStatement使用不同的参数多次执行相同的插入 或者用于Statement对象向
  • Chrome扩展:访问background.html中的跨域iframe

    由于页面的复杂性 XHR 并不是真正的选择 我正在尝试编写一个扩展来抓取需要作为网页加载的网站 我想出的最佳解决方案是通过放置在background html 中的iframe 进行抓取 当满足目标页面上的某些条件时 扩展程序将向用户提供通
  • 在 32 位系统上使用 int64_t 而不是 int32_t 对性能有何影响?

    我们的 C 库当前使用 time t 来存储时间值 我开始在某些地方需要亚秒级精度 因此无论如何 那里都需要更大的数据类型 此外 在某些地方解决 2038 年问题可能会很有用 因此 我正在考虑完全切换到具有底层 int64 t 值的单个 T