众所周知,它与初始化分配的内存calloc不同malloc.使用时calloc,内存设置为零.使用时malloc,内存不会被清除.
所以在日常工作中,我认为calloc是malloc+ memset.顺便说一下,为了好玩,我为基准编写了以下代码.
结果令人困惑.
代码1:
#include<stdio.h>
#include<stdlib.h>
#define BLOCK_SIZE 1024*1024*256
int main()
{
int i=0;
char *buf[10];
while(i<10)
{
buf[i] = (char*)calloc(1,BLOCK_SIZE);
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
代码1的输出:
time ./a.out
**real 0m0.287s**
user 0m0.095s
sys 0m0.192s
Run Code Online (Sandbox Code Playgroud)
代码2:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BLOCK_SIZE 1024*1024*256
int main()
{
int i=0;
char *buf[10];
while(i<10)
{
buf[i] = (char*)malloc(BLOCK_SIZE);
memset(buf[i],'\0',BLOCK_SIZE);
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
代码2的输出:
time ./a.out
**real 0m2.693s**
user 0m0.973s
sys 0m1.721s
Run Code Online (Sandbox Code Playgroud)
更换 …
来自Erlang Programming(2009):
Erlang并发性快速且可扩展.它的进程是轻量级的,因为Erlang虚拟机不会为每个创建的进程创建一个OS线程.它们在VM中创建,调度和处理,与底层操作系统无关.结果,进程创建时间大约为微秒,并且与并发存在的进程的数量无关.将其与Java和C#进行比较,其中为每个进程创建底层OS线程:您将获得一些非常有竞争力的比较,Erlang大大优于两种语言.
来自Erlang的并发编程(pdf) (幻灯片)(2003):
我们观察到创建Erlang进程所需的时间是1μs到2,500个进程; 此后,对于多达30,000个过程,它增加到大约3μs.Java和C#的性能显示在图的顶部.对于少量过程,创建过程大约需要300μs.创建两千多个流程是不可能的.
我们看到,对于多达30,000个进程,在两个Erlang进程之间发送消息的时间约为0.8μs.对于C#,每个消息大约需要50μs,直到最大进程数(大约1800个进程).Java更糟糕的是,对于多达100个进程,每个消息花了大约50μs,此后当大约有1000个Java进程时,它每个消息迅速增加到10ms.
我并不完全理解为什么Erlang进程在产生新进程方面更有效率,并且每个进程的内存占用量更小.OS和Erlang VM都必须进行调度,上下文切换,并跟踪寄存器中的值等等......
为什么OS线程的实现方式与Erlang中的进程不同?他们还需要支持更多的东西吗?为什么他们需要更大的内存占用?为什么他们的产卵和沟通较慢?
从技术上讲,为什么在产生和通信时,Erlang中的进程比OS线程更有效?为什么操作系统中的线程不能以同样有效的方式实现和管理?为什么操作系统线程的内存占用量更大,产生和通信速度更慢?
您能否指出替代数据存储工具并提供充分的理由来使用它们而不是旧的关系数据库?在我看来,大多数应用程序很少使用SQL的全部功能 - 看看如何构建一个无SQL的应用程序会很有趣.
我知道可以在Android上使用的许多语言来构建应用程序,其中大多数是与JVM相关的,但我还是找不到它的Erlang实现.
是否有适用于Android的Erlang端口?
如果没有一个好的端口可用,那么如何制作这样的端口呢?
我已经完成了计算机工程学位.我们有一些数字信号处理,信息理论等基础电子课程,但我的主要领域是编程.
但是,我希望进入嵌入式系统编程,我不知道它是如何完成的.但是,我非常热衷于进入这个领域.
我的问题:
我们的头文件用于#pragma pack(1)大多数结构(用于网络和文件I/O).据我所知,它将结构的对齐方式从默认的8个字节更改为1个字节的对齐方式.
假设一切都在32位Linux(也许是Windows)中运行,那么这种打包对齐是否会带来任何性能损失?
我不关心库的可移植性,但更关注文件和网络I/O与不同#pragma包的兼容性以及性能问题.
我正在使用嵌入式设备,并且有一些代码最初是使用IAR编译器编译的.
我试图使用GCC编译器重新编译所述代码.
有一个特殊的声明:typedef __IO,它根本没有被编译("无法识别的符号错误").
任何人都可以建议我如何正确地编译这个语句?
我目前正在使用Java,我在网上读了很多关于Erlang的内容,我有两大问题:
Erlang会比简单的Java慢多少(如果有的话)?
我在这里假设Java将从网络上的枪战基准更快(Erlang不那么好).那么,我需要多少CPU才能让Erlang超越单线程Java(在我的特殊情况下,如下所示)?
在阅读了有关Erlang一段时间之后,我发表了大量评论/帖子,说大多数大型Erlang系统包含大量的C/C++.
这是出于速度原因(我的假设)还是别的什么?即为什么需要这个?
我已经读过大多数机器的处理器数量上升和线程模型很难(我同意)但是我想找出什么时候会越过"线"以便我可以在右边改变语言/范例时间.
一些背景/上下文:
我在Java服务上使用服务器端,这些服务非常受CPU限制并且很容易并行.这通常是由于单个传入更新(通过TCP)触发对多个(100个)输出的更改.
计算通常非常简单(几个循环,只需很多算术),输入速度非常快(100/s).
目前,我们在4台CPU机器上运行,并在每台机器上运行多项服务(因此多线程非常无意义,Java似乎运行得更快,没有同步块等,使其成为多线程).现在有一个强大的速度推动,我们现在可以访问24台处理器机器(如果需要,每个进程),所以我想知道如何最好地继续 - 大规模多线程Java或更容易编码的东西,如Erlang.
我想为Erlang创建一个Intellij IDEA语言支持插件.
我遇到的第一个也是最大的问题是制作JFlex Erlang语法定义.
有谁知道我在哪里可以获得Erlang的EBNF或BNF?
大多数BLAS Level 1 API可以使用Fortran 9x +矢量化赋值和内部过程直接编写.
假设您正在使用现代优化编译器(如英特尔Fortran)以及正确的特定于目标的编译器优化选项,那么使用BLAS 1级程序是否有任何性能优势,例如英特尔MKL或其他快速BLAS实现?
如果有,那么当这些好处出现时,典型的矢量大小是多少?