精华内容
下载资源
问答
  • 计算机芯片的物理特性决定了它只能接受二进制指令。不同计算机芯片的指令集不同。高级编程语言需要转化成二进制机器语言才能...现在各行各业的朋友都开始使用计算机解决自己的业务问题,网络上有大量的免费公开课,...

    计算机芯片的物理特性决定了它只能接受二进制指令。不同计算机芯片的指令集不同。高级编程语言需要转化成二进制机器语言才能被计算机所执行。编译型语言需要使用编译器经过编译和连接生成可执行文件,解释型语言需要使用解释器解释源代码。解释型语言更容易上手,但是运行速度更慢,必要时要使用C/C++重写或使用JIT技术加速。

    现在各行各业的朋友都开始使用计算机解决自己的业务问题,网络上有大量的免费公开课,教我们处理数据并数学建模。Python等编程语言上手快,开源软件多,足以应付绝大多数的需求。在计算机软硬件体系中,上述工作都是在最顶层,用户执行程序需要依赖于计算机硬件和系统软件。聊天用的微信、娱乐玩的农药、上网打开的浏览器、还有我们自己写的程序…这些程序是如何从源代码,变成计算机芯片可以执行的程序呢?

    a46548a0f71db629531bfc5a4d49c7f9.png
    计算机软硬件体系结构

    本文并不是想把这个复杂的链条都解释得非常清楚,或者鼓励大家都去学习底层编程知识,而是想让读者对这个流程有一个基本的认识。因为,当我们熟练掌握了一定编程基础,开始上手更大规模的数据或更复杂的数学模型时,会遇到一些瓶颈,直接调用别人写好的程序或者应用新热算法都无法直接解决问题。这时候了解计算机的基本组成和运行原理,打好基础,才能为顶层应用拓展思维。

    计算机只能执行二进制代码

    也许你已经知道,计算机是基于二进制运行的。就像道家哲学的阴阳一样,计算机只有两个状态,开或关、真或假、1或0…因为,组成计算机的基本元件——半导体只能以二进制进行计算。我们编程所用的C/C++、Python、大数据、AI等层出不穷的技术,以及我们存储在电子设备的文本、音频、图像、视频等媒介,最终都是以二进制的形式,被计算和处理的。计算机体系最底层的工程师要使用二进制代码控制芯片来做计算和处理。

    我在我的Mac上编写了一个名为plusc = a + b程序,其二进制和汇编代码如下所示:

    ➜  objdump -s plus

    plus:   file format Mach-O 64-bit x86-64

    _main:
    100000f30:      55      pushq   %rbp
    100000f31:      48 89 e5        movq    %rsp, %rbp
    100000f34:      48 83 ec 20     subq    $32, %rsp
    100000f38:      c7 45 fc 00 00 00 00    movl    $0, -4(%rbp)
    100000f3f:      c7 45 f8 01 00 00 00    movl    $1, -8(%rbp)
    100000f46:      c7 45 f4 02 00 00 00    movl    $2, -12(%rbp)
    100000f4d:      c7 45 f0 00 00 00 00    movl    $0, -16(%rbp)
    100000f54:      8b 45 f8        movl    -8(%rbp), %eax
    100000f57:      03 45 f4        addl    -12(%rbp), %eax
    100000f5a:      89 45 f0        movl    %eax, -16(%rbp)
    100000f5d:      8b 75 f8        movl    -8(%rbp), %esi
    100000f60:      8b 55 f4        movl    -12(%rbp), %edx
    100000f63:      8b 4d f0        movl    -16(%rbp), %ecx
    100000f66:      48 8d 3d 35 00 00 00    leaq    53(%rip), %rdi
    100000f6d:      b0 00   movb    $0, %al
    100000f6f:      e8 0e 00 00 00  callq   14 
    100000f74:      31 c9   xorl    %ecx, %ecx
    100000f76:      89 45 ec        movl    %eax, -20(%rbp)
    100000f79:      89 c8   movl    %ecx, %eax
    100000f7b:      48 83 c4 20     addq    $32, %rsp
    100000f7f:      5d      popq    %rbp
    100000f80:      c3      retq
    ........

    首行的file format Mach-O 64-bit x86-64表示这是一个可以运行在64位x86架构的处理器上、基于Mac OS的一段程序。不同的计算机芯片厂商所设计的半导体电路不同,在芯片上编程的二进制规则不同。执行同样的一段c = a + b的逻辑,在基于ARM架构芯片的Android手机上所需要的二进制代码与上面展示的会截然不同。当前市场上计算机CPU芯片基本被几大科技公司垄断,除了刚提到的Intel和AMD研发的应用在个人电脑上的x86-64处理器,应用在手机、平板电脑等移动设备上的ARM架构处理器,还有应用在大型服务器和超级计算机上的IBM Power系列处理器等。不同架构的CPU处理器都有自己的一套指令集(instruction set architecture,简称ISA),这就像一个设计图纸和使用说明书,告诉编程人员如何使用在其芯片上进行编程:包括如何进行加减乘除计算,如何从内存中读取数据等指令操作。底层开发人员会根据不同指令集,适配不同的CPU处理器。计算机能执行的指令,又被成为机器语言机器码

    前面所展示的二进制文件是一个可执行文件。什么是可执行文件呢?可执行文件就是二进制机器语言的集合,可以被机器执行,得到我们想要的结果。我们在Windows上常会遇到的.exe文件,就是可执行文件,exe其实是executable的缩写,从手机应用商店下载的APP也是可执行文件的一种变体。

    C语言从源代码到可执行文件

    很多朋友觉得C/C++编程调试难,没有比较就没有伤害,看到前文所提到的一个简单加法的程序竟然需要这么多看不懂的01代码,是不是觉得C语言简直是天才般的发明。是的,C语言的发明者当时考虑的就是不同芯片厂商有不同的指令集,相互之间难以兼容,于是想在那些晦涩难懂的底层语言上,建立一个更为通用的编程范式,这样编程人员不用浪费时间精力去识记大量的01二进制指令。那C语言代码是如何转化为可被机器执行的二进制文件呢?编译器和操作系统是两个非常关键的技术。

    下面继续以加法计算plus.c源代码为例,展示编译器和操作系统计算机将C语言转化为机器可执行文件。

    #include 

    int main(){
        int a = 1, b = 2, c = 0;
        c = a + b;
        printf("a = %d b = %d c = %d \n", a, b ,c);
        return 0;
    }

    Linux和Mac OS用户可以使用gcc -o plus plus.c这个命令来将plus.c的源代码编译成名为plus的可执行文件,plus会生成在当前的文件夹下。

    执行这个二进制文件,结果将被打印到屏幕上:

    $ ./plus
    a = 1 b = 2 c = 3

    gcc是一款开源的编译器,是GNU Compiler Collection中的一员,它可以将C语言代码编译成可执行文件。GNU Compiler Collection还有C++编译器g++、Fortran编译器gfortran,并且支持包括x86-64和ARM在内的不同指令集。

    1759b3a81ec8e862af040e0bbbd49755.png
    源代码编译执行过程

    C语言从源代码到执行,要使用编译器来编译(compile)、汇编(assembly)并连接(link)所依赖的库,形成机器可执行文件。执行这个二进制文件时,操作系统会为程序分配内存和CPU资源。“编译”和“汇编”,相当于将C语言翻译成底层语言。另外,代码中使用了库函数printf,当我们使用别人写好的函数时,需要将这些前人写好的库函数连接到我们的可执行文件中,否则有调用函数失败的错误。我们将这种需要编译的语言称为编译型语言。编译型语言有C/C++、Fortran等。

    操作系统和编译器是紧密相连的,不同操作系统所提供的编译环境不同。Linux和GCC编译器密不可分,Windows有自家研发的MSVC(Microsoft Visual C++)。不同操作系统在管理网络、读写硬盘、图形化等具体的实现方式不同,库函数连接方式不同…可执行文件一般需要调用这些操作系统接口,所以最终连接生成的可执行文件会截然不同。了解了编译知识,就不难明白为什么很多软件提供商对同一个软件会提供Windows、Mac OS、Linux、iOS、Android等多个版本的下载。因为不同平台的硬件、编译器和操作系统存在着巨大差异,可执行文件完全不同。所以,也就不难理解Windows软件为什么不可能在Mac OS上运行。

    实际构建一个大型项目时,编译要考虑的问题会更多。比如我自己编写了多个文件,文件1会被文件2调用,所以要先编译文件1,后编译文件2,否则会因为顺序颠倒而报错;还比如编译型语言对所以依赖的库函数非常挑剔,如果版本过低,有可能出现编译错误。类似的问题会很多,因此编译型语言在编程和调试时更麻烦,实际操作中一般会使用构建工具链(toolchain),根据一定的顺序,从前到后串起来地去编译。

    解释性语言:Java、Python、R…

    既然可以将01组成的机器语言抽象成容易编写的C语言,那为什么不能继续再用类似的办法,再做一次包装呢?IT圈的一句名言就是:计算机科学任何领域的问题都可以通过增加一个中间层来解决。一些大牛忍受不了C语言这样编写和调试太慢,系统平台之间无法共享移植的问题,于是开始自立门户,创建了新的编程语言,最有名的要数Java和Python,这类语言不需要每次都编译,因此被称为解释型语言。matlab、R、JavaScript也是解释语言。

    a6c2e37dfe7bfbf462ad8114badbec74.png
    解释型语言执行过程

    解释型语言一般是使用C语言等偏底层的语言做一个虚拟机或者解释器,编程人员需要先在自己的计算机上安装这个解释器,接下来就只用关心自己的源代码,其他的事情都交给解释器去做。如果把编译型语言的编译过程比作将源代码“翻译”成机器语言的话,那么解释型语言就是同声传译。编译型语言是一篇提前就“翻译”好的稿子,拿过来就能被读出来,这样肯定更快;解释型语言要等翻译边“听”边“翻译”,速度当然慢很多。

    有了解释器,我们可以在任何安装了Python的机器上运行同样一份.py源代码文件。像Python这样的解释语言就像一个高级计算器,非常容易上手,有一些理工基础的朋友,半天时间就能学会。

    其实,这就是一个妥协的过程,解释语言放弃了速度,取得了易用性和可移植性。

    如果我还是关心速度呢?当然还是要回归底层,拒绝中间商赚差价嘛!

    以Python为例,为了保证性能,大部分高性能科学计算库其实都是使用编译型语言编写的。比如numpy,用户安装numpy的包时,其实就是下载了C/C++和Fortran源代码,并在本地编译成了可执行的文件。Python用户自己可以使用Cython这样的工具,R语言可以使用Rcpp。我最近在使用Java来调用C++代码,速度有成倍提升。一些计算密集型的程序可以考虑用这种方法来进行优化。

    另一种方案是JIT(Just-In-Time)技术。JIT把需要加速的代码编译成了机器语言,不再需要“同声传译”拖累自己了。我在Python上用numba库进行过JIT测试,同样的代码会有8倍以上的速度提升。

    本专栏以后也将介绍如何对解释语言进行加速。

    小结

    f1a0301f1aa4f8f6a1658cf9c6370379.png
    北京后海 摄于2011年11月

    计算机芯片的物理特性决定了它只能接受二进制指令。不同计算机芯片的指令集不同。高级编程语言需要转化成二进制机器语言才能被计算机所执行。编译型语言需要使用编译器经过编译和连接生成可执行文件,解释型语言需要使用解释器解释源代码。解释型语言更容易上手,但是运行速度更慢,必要时可使用C/C++重写或使用JIT技术加速。

    展开全文
  • 感谢博主分享: ...学会如何计算出来我们设计模型以及中间变量所占显存大小,想必知道了这一点,我们对自己显存也就会得心应手了。 计算 首先我们应该了解一下基本数据信息: 1 G = 1024 MB

    感谢博主的分享:
    计算模型以及中间变量的显存占用大小

    前言

    OUT OF MEMORY,显然是显存装不下你那么多的模型权重还有中间变量,然后程序奔溃了。怎么办,其实办法有很多,及时清空中间变量,优化代码,减少batch,等等等等,都能够减少显存溢出的风险。

    但是这篇要说的是上面这一切优化操作的基础,如何去计算我们所使用的显存。学会如何计算出来我们设计的模型以及中间变量所占显存的大小,想必知道了这一点,我们对自己显存也就会得心应手了。

    计算

    首先我们应该了解一下基本的数据量信息:

    • 1 G = 1024 MB
    • 1 M = 1024 KB
    • 1 K = 1024 Byte
    • 1 B = 8 bit

    平常使用的向量所占的空间大小,以Pytorch官方的数据格式为例(所有的深度学习框架数据格式都遵循同一个标准):
    在这里插入图片描述
    我们只需要看左边的信息,在平常的训练中,我们经常使用的一般是这两种类型:

    • float32 单精度浮点型
    • int32 整型

    一般一个8-bit的整型变量所占的空间为1B也就是8bit。而32位的float则占4B也就是32bit。而双精度浮点型double和长整型long在平常的训练中我们一般不会使用。
    也就是说,假设有一幅RGB三通道真彩色图片,长宽分别为500 x 500,数据类型为单精度浮点型,那么这张图所占的显存的大小为:500 x 500 x 3 x 4B = 3M。

    而一个(256,3,100,100)-(N,C,H,W)的FloatTensor所占的空间为256 x 3 x 100 x 100 x 4B = 31M

    2.显存计算–模型与输入

    占用显存比较多空间的并不是我们输入图像,而是神经网络中的中间变量以及使用optimizer算法时产生的巨量的中间参数。
    我们首先来简单计算一下Vgg16这个net需要占用的显存:

    通常一个模型占用的显存也就是两部分:

    • 模型自身的参数(params)
    • 模型计算产生的中间变量(memory)

    在这里插入图片描述
    我们输入的是一张224x224x3的三通道图像,可以看到一张图像只占用150x4k,但上面标注的是150k,这是因为上图中在计算的时候默认的数据格式是8-bit而不是32-bit,所以最后的结果要乘上一个4。

    我们可以看到,左边的memory值代表:图像输入进去,图片以及所产生的中间卷积层所占的空间。我们都知道,这些形形色色的深层卷积层也就是深度神经网络进行“思考”的过程:
    在这里插入图片描述
    图片从3通道变为64 –> 128 –> 256 –> 512 …. 这些都是卷积层,而我们的显存也主要是他们占用了。

    还有上面右边的params,这些是神经网络的权重大小,可以看到第一层卷积是3×3,而输入图像的通道是3,输出通道是64,所以很显然,第一个卷积层权重所占的空间是 (3 x 3 x 3) x 64。

    另外还有一个需要注意的是中间变量在backward的时候会翻倍!

    • 举个例子,下面是一个计算图,输入x,经过中间结果z,然后得到最终变量L:
    • 在这里插入图片描述

    我们在backward的时候需要保存下来的中间值。输出是L,然后输入x,我们在backward的时候要求L对x的梯度,这个时候就需要在计算链L和x中间的z
    在这里插入图片描述
    dz/dx这个中间值当然要保留下来以用于计算,所以粗略估计,backward的时候中间变量的占用了是forward的两倍。

    显存计算–模型详解

    有参数的层即会占用显存的层。我们一般的卷积层都会占用显存,而我们经常使用的激活层Relu没有参数就不会占用了。

    占用显存的层一般是:

    • 卷积层,通常的conv2d
    • 全连接层,也就是Linear层
    • BatchNorm层
    • Embedding层

    而不占用显存的则是:

    • 刚才说到的激活层Relu等
    • 池化层
    • Dropout层

    具体计算方式:

    • Conv2d(Cin, Cout, K): 参数数目:Cin × Cout × K × K
    • Linear(M->N): 参数数目:M×N
    • BatchNorm(N): 参数数目: 2N
    • Embedding(N,W): 参数数目: N × W

    3.显存计算–优化器和动量

    优化器也会占用我们的显存!
    在这里插入图片描述
    上式是典型的SGD随机下降法的总体公式,权重W在进行更新的时候,会产生保存中间变量:
    在这里插入图片描述
    也就是在优化的时候,模型中的params参数所占用的显存量会翻倍。

    当然这只是SGD优化器,其他复杂的优化器如果在计算时需要的中间变量多的时候,就会占用更多的内存。

    4.总结:

    总结一下,我们在总体的训练中,占用显存大概分以下几类:

    • 模型中的参数(卷积层或其他有参数的层)
    • 模型在计算时产生的中间参数(也就是输入图像在计算时每一层产生的输入和输出)
    • backward的时候产生的额外的中间参数
    • 优化器在优化时产生的额外的模型参数

    但其实,我们占用的显存空间为什么比我们理论计算的还要大,原因大概是因为深度学习框架一些额外的开销吧,不过如果通过上面公式,理论计算出来的显存和实际不会差太多的。

    优化

    优化除了算法层的优化,最基本的优化无非也就一下几点:

    • 减少输入图像的尺寸
    • 减少batch,减少每次的输入图像数量
    • 多使用下采样,池化层
    • 一些神经网络层可以进行小优化,利用relu层中设 inplace购买显存更大的显卡
    • 从深度学习框架上面进行优化
    展开全文
  • 如何确定域在结构中的字节偏移? ANSI C 在 <stddef.h>...如果出于某种原因, 你需要自己实现这个功能, 可以使用下边这样的代码:  #define offsetof(type,f) ( (size_t) ( (cha...

         如何确定域在结构中的字节偏移?

    ANSI C 在 <stddef.h> 中定义了 offsetof() 宏, 用 offsetof(struct s, f) 可以计算出域 f 在结构 s 中的偏移量。如果出于某种原因, 你需要自己实现这个功能, 可以使用下边这样的代码:

             #define offsetof(type,f) ( (size_t) ( (char*)&((type*)0)->f - (char*)(type*)0) )

        这种实现不是 100% 的可移植; 某些编译器可能会合法地拒绝接受。

        注:上述文字来源于书籍《你必须知道的495个C语言问题》。

        上述代码对于大神来说可能一眼或者两眼就能看懂,但是对于C语言还是像我一样还在懵逼状态的小白来说就同样懵逼,精辟的代码没有解释,让小白们体会不到C语言的强大之处,遍寻(稍微翻了翻)Internet无果后,我决定自己用自己的理解来解释一下,还是不理解的下方评论留言。

        理清问题,要用拆的思想,由局部到整体,由内而外。(装逼的方法论。。。。)

        首先这句话的意思是将

            ( (sie_t) ( (char*)&((type*)0)->f - (char*)(type*)0) )

        用宏定义#define功能实现用

            offsetof(type,f)

        来代替。 也就是我们调用 offsetof(type, f) 就是使用了 ((size_t) ((char *)&((type *)0)->f - (char *)(type *)0)) 这句精妙的语句。实现的功能就是上文所说的可以计算出域 f 在结构 s 中的偏移量(这里偏移量的单位是字节)。我们下面来解释这段代码。

    1. (type*)0    //将0强制转换为指向type型结构体的指针,即假装地址0处有一个type的结构
    2. (char*)(type*)0)  //将1.处的结构体指针强制转换成字符型指针,这样做的目的是为了使指针(也是一种地址)做减法时得出的偏移量的单位是字节型
    3. ((type*)0)->f    //这段代码的结果是得到地址在0处的type结构体的成员f的值地址在0处的type结构体的成员f的值
    4. &((type*)0)->f   //在3.的基础上加上了取地址符&,得到的是地址在0处的type结构体的成员f的值的地址地址在0处的type结构体的成员f的值的地址
    5. (char*)&((type*)0)->f  //在4.的基础上加上(char*) ,目的同2.处
    6. (char*)&((type*)0)->f - (char*)(type*)0)   // 这里其实是上面的5. -2.(结构体成员地址 - 结构体基地址),
                                                //得到的就是我们所求的偏移量(以字节为单位)
    7. 在6. 整体上又加了强制类型转换(size_t),目的是为了使结果为无符号整数。 

     

    补充一下size_t的来源。

    百度百科:

        size_t是标准C库中定义的,应为unsigned int,在64位系统中为 long unsigned int。

     

    一个基本的无符号整数的C / C + +类型, 它是sizeof操作符返回的结果类型, 该类型的大小可选择。因此,它可以存储在理论上是可能的任何类型的数组的最大大小。 换句话说,一个指针可以被安全地放进为size_t类型(一个例外是类的函数指针,但是这是一个特殊的情况下)。 size_t类型通常用于循环、数组索引、大小的存储和地址运算。 虽然size_t可以存储一个指针,它的目的是更好地使用另一个unsinged整数类型uintptr_t形式。 在某些情况下,使用size_t类型是更为有效,比习惯性使用无符号类型的程序会更安全。

    size_t是在基于无符号整数memsize类型的C / C + +的标准库中定义的。 C语言中,此类型位于头文件stddef.h中,而在C++中,则位于cstddef中。

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 以便程序中你想显示的字符,可以在字库中找到对应的代码。那么在当你在程序中输入汉字字符或字母、符号时,程序会如何对他们进行处理呢?懂了这个处理过程,也就理解了程序如何找到对应的字符库。
  • 如何统计代码数量

    千次阅读 2013-10-30 16:01:02
    查找过很多种统计代码量的方式 有用wc 计算的 wc -l *.{cpp,h} 有用自己bash文件统计 后来总算找到比较好用方式 cloc 安装方式 brew install cloc 统计结果例子如下: cloc ...

    查找过很多种统计代码量的方式

    有用wc 计算的

    wc -l *.{cpp,h}

    有用自己写的bash文件统计的


    后来总算找到比较好用的方式


    cloc

    安装方式

    brew install cloc

    统计结果例子如下:

    cloc AFNetworking/
          78 text files.
          73 unique files.                              
          73 files ignored.
    
    http://cloc.sourceforge.net v 1.60  T=0.38 s (109.4 files/s, 19822.5 lines/s)
    -------------------------------------------------------------------------------
    Language                     files          blank        comment           code
    -------------------------------------------------------------------------------
    Objective C                     23           1099            513           4027
    C/C++ Header                    18            444           1151            370
    YAML                             1              0              0              7
    -------------------------------------------------------------------------------
    SUM:                            42           1543           1664           4404
    -------------------------------------------------------------------------------



    展开全文
  • 只知道通过自己的平台来赚钱,却不知道除了自己平台外。很多其他平台其实也是可以赚钱的,而且认识的很多站长通过第三天平台搞点击率,赚取了更多的钱。那么,接下来就谈谈有哪些第三方平台靠点击率怎么赚钱? 一、...
  • 当数据中存在NaN时,我找不到计算包含多于两个变量观测值数组相关系数矩阵函数 . 有一些函数可以为变量对执行此操作(或者只使用~is.nan()来掩盖数组) . 但是通过循环遍历大量变量来使用这些函数,计算每对...
  • 使用源代码安装要求用户了解基本编译过程、能够应付各种不能编译意外、必须自己完成抽象配置、甚至懂得软件开发,能够自己打补钉,……对非计算机专业用户而言简直就是天方夜谭。这是把软件开发最后一步抛...
  • 如何选择适合自己项目编程语言

    千次阅读 2015-06-30 18:42:03
    有些语言能够帮助你更轻松地编写防止崩溃的代码。有些语言非常擅于剖析文本并有效作用于服务器上。有些语言具有强大的公司投资。也有些语言之所以存在是因为它们与大量不适合重新编写的现有代码相兼
  • 计算结构体大小时,并不是单纯将成员大小相加,而是要考虑结构体内存对齐规则。 结构体内存对齐规则: 1.第一个结构体成员,在结构体变量首地址偏移为0地址处(第一个成员不需要对其,但具有对其数); 2。除...
  • 由于计算量和服务问题,该接口调用返回时间可能出现过长情况。需求方希望设定一个超时参数,当函数调用时间超时则返回一个超时json数据,未超时则正常返回数据。最终我使用了多线程 + 队列Queue对需求进行了...
  • 简单JS轮播图代码

    2020-12-10 15:25:46
    在团队带人,突然被人问到轮播图如何实现,进入前端领域有一年多了,但很久没自己写过,一直是用大牛写插件,今天就写个简单适合入门者学习小教程。当然,轮播图实现原理与设计模式有很多种,我这里讲是用...
  • ANSI C在中定义了offsetof()宏,用offsetof(struct_type,name)可以计算出成员name在结构struct type中的偏移,如果处于某种原因,需要自己实现这个功能,可以使用下面这样的代码:  #define offsetof(type, name...
  • 我至今仍记得当我开始编写自己的操作系统时所遭受的挫败感,那是一种不知道如何着手的无助的感觉。还好我坚持了下来,克服了各种困难,并完成了自己的操作系统雏形。 进而我想到,一定不只是我一个人对编写自己的...
  • 我至今仍记得当我开始编写自己的操作系统时所遭受的挫败感,那是一种不知道如何着手的无助的感觉。还好我坚持了下来,克服了各种困难,并完成了自己的操作系统雏形。 进而我想到,一定不只是我一个人对编写自己的...
  • 由于在科学计算中经常会碰到大量的代码库需要编译,而这种编译过程往往并不是那么显而易见的。对于很多科研人员来说,这构成了使用上的一种瓶颈,很多人费时费力不得其门而入,甚至开始怀疑人生,少部分人折腾一番后...
  • CPU使用率的计算【总结】

    千次阅读 2012-09-08 12:18:21
    【所谓“总结”,就是结合自身经验与他人结论,进行汇总,略减,与分析】 【有些他人顶好总结,可以直接取过来,好比有些...打开任务管理器,又想,这里动态显示CPU使用率如何计算的呢?这个问题一问出来,便展
  • 书接前文,上一期带大家学会了如何找到自己需要shapefile文件。 教程合集 | 地图数据找不到?家园都有解决方案! 那么,在拥有了正确地图文件后,如何画出各种高大上地图呢?从本期开始,就要教大家如何绘制...
  • Unix环境中编程语言(尤其是C,Perl或Python)具有广泛实用函数库和实用程序库,可用于验证数字格式,计算日期偏移并执行许多其他有用任务。 在使用Shell时,我们会独自承担更多工作,因此,第一章重点...
  • 总结 写代码步骤

    2018-10-11 14:44:02
    代码也打了不少了,如何写出优秀的代码呢,在这里我呢将自己的一点心得记录了一下,让刚进入计算机的新朋友能参考一下。 写代码第一步先想,也就是思考,先把问题的前因后果,解决办法想清楚再开始敲代码,这样代码...
  • 之所以选择这些功能,是因为这些技术在我们日常生活中有很强的的应用价值,并且对于一些算法运算大、算术复杂、处理速度低技术,可以利用MATLAB简单快捷得到数据结果,又能够得到直观图示。 提出了基于...
  • 4.1.2 避免编写不必要的代码 98 4.1.3 给表瘦身 98 4.1.4 最大化聚集索引的使用 99 4.1.5 降低每张表中索引的数量 99 4.2 规范化应该走多远 99 4.3 规范化过程 100 4.4 实体和属性的形式:第一范式 100 ...
  • Java代码实例

    2016-06-21 22:44:51
    11.4.1 创建自己的异常类 212 11.4.2 使用自定义的异常类 213 11.4.3 显性再抛出作用的体现 215 11.5 异常的匹配 217 11.5.1 同时捕获多种异常 217 11.5.2 多个catch语句的先后顺序 218 11.6 断言 219...
  • 为了更好地使用计算机,我们需要提高自己的打字速度与准确性。尤其对于程序员,每天都要与程序为伴,编写大量代码,更要加强打字技能。 1.常用技能 包括输入速度、vim指令、常用编程软件快捷键等。 前两者自...
  • 什么是递归 递归是程序设计语言中的一种广泛应用的算法,能大大减少多次重复计算的代码量。递归就是某个函数或者操作在运行中调用自己的现象,类似于一个连环套娃的过程。/////////递归的实现当然,由于计算机的计算...
  • 疫情原因回不去学校,作为一个马上毕业,即将入职腾讯的大四生,分享一下自己的学习历程吧。 本人在大学之前从未接触过编程,最开始的编程学习还是在高考完后,从书店买了本C Primer Plus,然后暑假开始啃,前前后...
  • 您还将学习使用SDK将AWS服务集成到自己的应用程序中,并获得有关如何设计应用程序以实现高可用性,容错性和可伸缩性的便捷想法。 全面更新,包括对AWS的最新修订和更新; 该新版本还提供了三章,涵盖了AWS平台的...
  • 我使用第三方库,经过大量计算后返回一个包含指针ctypes对象....包含指针ctypes对象无法进行pickle解决方法:Python无法自动为您执行此操作:您必须构建代码自己选择所有需要数据,将它们放在合...
  • 如何确定域在结构中字节偏移

    千次阅读 2014-06-05 14:19:24
    如何确定域在结构中的字节偏移? ANSI C 在 中定义了offsetof() 宏...如果出于某种原因, 你需要自己实现这个功能, 可以使用下边这样的代码:#define offsetof(type, f) ((size_t) \((char *)&((type *)0)->f - (char *)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 497
精华内容 198
关键字:

如何计算自己的代码量