Last active
March 22, 2019 05:26
-
-
Save goropikari/216bda6b0d3fb339a238eb99179c5722 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Copyright (c) 2019 goropikari \n", | |
"Released under the MIT license \n", | |
"https://opensource.org/licenses/mit-license.php" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Julia Version 1.1.0\n", | |
"Commit 80516ca202 (2019-01-21 21:24 UTC)\n", | |
"Platform Info:\n", | |
" OS: Linux (x86_64-pc-linux-gnu)\n", | |
" CPU: Intel(R) Core(TM) i5-4460T CPU @ 1.90GHz\n", | |
" WORD_SIZE: 64\n", | |
" LIBM: libopenlibm\n", | |
" LLVM: libLLVM-6.0.1 (ORCJIT, haswell)\n", | |
"Environment:\n", | |
" JULIA_SHELL = /bin/bash\n", | |
" JULIA_EDITOR = nvim\n" | |
] | |
} | |
], | |
"source": [ | |
"versioninfo()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"using Libdl" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"arraycap (generic function with 1 method)" | |
] | |
}, | |
"execution_count": 3, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# derive the capacity of a given array\n", | |
"header = if ispath(\"/usr/include/julia/julia.h\")\n", | |
" \"/usr/include/julia\"\n", | |
"elseif ispath(\"$(dirname(Base.julia_cmd()[1]))/../include/julia/julia.h\")\n", | |
" \"$(dirname(Base.julia_cmd()[1]))/../include/julia\"\n", | |
"else\n", | |
" println(\"Can't find julia.h. Please input the path to the file.\")\n", | |
" path = readline()\n", | |
" while (!ispath(path) )\n", | |
" println(\"Can't find julia.h. Please input the path to the file.\")\n", | |
" path = readline()\n", | |
" end\n", | |
" path\n", | |
"end\n", | |
"C_code = raw\"\"\"\n", | |
"#include \"julia.h\"\n", | |
"\n", | |
"int jl_array_maxsize(jl_array_t *a) {\n", | |
" return a->maxsize;\n", | |
"}\n", | |
"\"\"\"\n", | |
"\n", | |
"const Clib = tempname()\n", | |
"open(`gcc -I $header -fPIC -O3 -msse3 -xc -shared -o $(Clib * \".\" * Libdl.dlext) -`, \"w\") do f\n", | |
" print(f, C_code) \n", | |
"end\n", | |
"arraycap(v) = ccall((:jl_array_maxsize, Clib), Int32, (Any,), v)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"10" | |
] | |
}, | |
"execution_count": 4, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"v = rand(10)\n", | |
"arraycap(v)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"The capacity is 0\n" | |
] | |
} | |
], | |
"source": [ | |
"v = Vector{Int}(undef, 0)\n", | |
"println(\"The capacity is \", arraycap(v))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"# of elements = 1: cacacity = 4\n", | |
"# of elements = 2: cacacity = 4\n", | |
"# of elements = 3: cacacity = 4\n", | |
"# of elements = 4: cacacity = 4\n", | |
"# of elements = 5: cacacity = 8\n", | |
"# of elements = 6: cacacity = 8\n", | |
"# of elements = 7: cacacity = 8\n", | |
"# of elements = 8: cacacity = 8\n", | |
"# of elements = 9: cacacity = 16\n", | |
"# of elements = 10: cacacity = 16\n", | |
"# of elements = 11: cacacity = 16\n", | |
"# of elements = 12: cacacity = 16\n", | |
"# of elements = 13: cacacity = 16\n", | |
"# of elements = 14: cacacity = 16\n", | |
"# of elements = 15: cacacity = 16\n", | |
"# of elements = 16: cacacity = 16\n", | |
"# of elements = 17: cacacity = 32\n", | |
"# of elements = 18: cacacity = 32\n", | |
"# of elements = 19: cacacity = 32\n", | |
"# of elements = 20: cacacity = 32\n", | |
"# of elements = 21: cacacity = 32\n", | |
"# of elements = 22: cacacity = 32\n", | |
"# of elements = 23: cacacity = 32\n", | |
"# of elements = 24: cacacity = 32\n", | |
"# of elements = 25: cacacity = 32\n", | |
"# of elements = 26: cacacity = 32\n", | |
"# of elements = 27: cacacity = 32\n", | |
"# of elements = 28: cacacity = 32\n", | |
"# of elements = 29: cacacity = 32\n", | |
"# of elements = 30: cacacity = 32\n", | |
"# of elements = 31: cacacity = 32\n", | |
"# of elements = 32: cacacity = 32\n" | |
] | |
} | |
], | |
"source": [ | |
"for i in 1:32\n", | |
" push!(v, i)\n", | |
" println(\"# of elements = $(lpad(i, 3)): cacacity = $(arraycap(v))\")\n", | |
"end" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"capacity = 10000000\n" | |
] | |
} | |
], | |
"source": [ | |
"sizehint!(v, 10_000_000)\n", | |
"println(\"capacity = \", arraycap(v))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"50000000" | |
] | |
}, | |
"execution_count": 8, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"n = 50_000_000" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"capacity = 57944824\n" | |
] | |
} | |
], | |
"source": [ | |
"v = Vector{Int}(undef, 0)\n", | |
"for i in 1:n\n", | |
" push!(v, i*10)\n", | |
"end\n", | |
"println(\"capacity = \", arraycap(v))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"25.78817646050732" | |
] | |
}, | |
"execution_count": 10, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"log2(arraycap(v))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/latex": [ | |
"\\begin{tabular}\n", | |
"{l | r | l}\n", | |
"name & size & summary \\\\\n", | |
"\\hline\n", | |
"Base & & Module \\\\\n", | |
"C\\_code & 91 bytes & String \\\\\n", | |
"Clib & 24 bytes & String \\\\\n", | |
"Core & & Module \\\\\n", | |
"Main & & Module \\\\\n", | |
"arraycap & 0 bytes & typeof(arraycap) \\\\\n", | |
"header & 69 bytes & String \\\\\n", | |
"n & 8 bytes & Int64 \\\\\n", | |
"startupfile & 50 bytes & String \\\\\n", | |
"v & 381.470 MiB & 50000000-element Array\\{Int64,1\\} \\\\\n", | |
"\\end{tabular}\n" | |
], | |
"text/markdown": [ | |
"| name | size | summary |\n", | |
"|:----------- | -----------:|:------------------------------- |\n", | |
"| Base | | Module |\n", | |
"| C_code | 91 bytes | String |\n", | |
"| Clib | 24 bytes | String |\n", | |
"| Core | | Module |\n", | |
"| Main | | Module |\n", | |
"| arraycap | 0 bytes | typeof(arraycap) |\n", | |
"| header | 69 bytes | String |\n", | |
"| n | 8 bytes | Int64 |\n", | |
"| startupfile | 50 bytes | String |\n", | |
"| v | 381.470 MiB | 50000000-element Array{Int64,1} |\n" | |
], | |
"text/plain": [ | |
"name size summary \n", | |
"––––––––––– ––––––––––– –––––––––––––––––––––––––––––––\n", | |
"Base Module \n", | |
"C_code 91 bytes String \n", | |
"Clib 24 bytes String \n", | |
"Core Module \n", | |
"Main Module \n", | |
"arraycap 0 bytes typeof(arraycap) \n", | |
"header 69 bytes String \n", | |
"n 8 bytes Int64 \n", | |
"startupfile 50 bytes String \n", | |
"v 381.470 MiB 50000000-element Array{Int64,1}" | |
] | |
}, | |
"execution_count": 11, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"varinfo()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
" total used free shared buff/cache available\n", | |
"Mem: 7852 4709 470 317 2672 2572\n", | |
"Swap: 4095 4 4091\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"Process(`\u001b[4mfree\u001b[24m \u001b[4m-m\u001b[24m`, ProcessExited(0))" | |
] | |
}, | |
"execution_count": 12, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"run(`free -m`)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"57944824\n" | |
] | |
} | |
], | |
"source": [ | |
"for i in 1:n\n", | |
" pop!(v)\n", | |
"end\n", | |
"println(arraycap(v))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/latex": [ | |
"\\begin{tabular}\n", | |
"{l | r | l}\n", | |
"name & size & summary \\\\\n", | |
"\\hline\n", | |
"Base & & Module \\\\\n", | |
"C\\_code & 91 bytes & String \\\\\n", | |
"Clib & 24 bytes & String \\\\\n", | |
"Core & & Module \\\\\n", | |
"Main & & Module \\\\\n", | |
"arraycap & 0 bytes & typeof(arraycap) \\\\\n", | |
"header & 69 bytes & String \\\\\n", | |
"n & 8 bytes & Int64 \\\\\n", | |
"startupfile & 50 bytes & String \\\\\n", | |
"v & 40 bytes & 0-element Array\\{Int64,1\\} \\\\\n", | |
"\\end{tabular}\n" | |
], | |
"text/markdown": [ | |
"| name | size | summary |\n", | |
"|:----------- | --------:|:------------------------ |\n", | |
"| Base | | Module |\n", | |
"| C_code | 91 bytes | String |\n", | |
"| Clib | 24 bytes | String |\n", | |
"| Core | | Module |\n", | |
"| Main | | Module |\n", | |
"| arraycap | 0 bytes | typeof(arraycap) |\n", | |
"| header | 69 bytes | String |\n", | |
"| n | 8 bytes | Int64 |\n", | |
"| startupfile | 50 bytes | String |\n", | |
"| v | 40 bytes | 0-element Array{Int64,1} |\n" | |
], | |
"text/plain": [ | |
"name size summary \n", | |
"––––––––––– –––––––– ––––––––––––––––––––––––\n", | |
"Base Module \n", | |
"C_code 91 bytes String \n", | |
"Clib 24 bytes String \n", | |
"Core Module \n", | |
"Main Module \n", | |
"arraycap 0 bytes typeof(arraycap) \n", | |
"header 69 bytes String \n", | |
"n 8 bytes Int64 \n", | |
"startupfile 50 bytes String \n", | |
"v 40 bytes 0-element Array{Int64,1}" | |
] | |
}, | |
"execution_count": 14, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"varinfo()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
" total used free shared buff/cache available\n", | |
"Mem: 7852 4713 467 316 2671 2569\n", | |
"Swap: 4095 4 4091\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"Process(`\u001b[4mfree\u001b[24m \u001b[4m-m\u001b[24m`, ProcessExited(0))" | |
] | |
}, | |
"execution_count": 15, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"run(`free -m`) # megabytes" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"10\n", | |
"20\n", | |
"30\n", | |
"40\n", | |
"50\n", | |
"60\n", | |
"70\n", | |
"80\n", | |
"90\n", | |
"100\n" | |
] | |
} | |
], | |
"source": [ | |
"for i in 1:10\n", | |
" println(unsafe_load(pointer(v), i))\n", | |
"end" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
" total used free shared buff/cache available\n", | |
"Mem: 7852 4316 859 320 2676 2962\n", | |
"Swap: 4095 4 4091\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/plain": [ | |
"Process(`\u001b[4mfree\u001b[24m \u001b[4m-m\u001b[24m`, ProcessExited(0))" | |
] | |
}, | |
"execution_count": 17, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"v = nothing\n", | |
"GC.gc()\n", | |
"run(`free -m`)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"setarraypar (generic function with 1 method)" | |
] | |
}, | |
"execution_count": 18, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"C_code2 = raw\"\"\"\n", | |
"#include \"julia.h\"\n", | |
"\n", | |
"void jl_set_array(jl_array_t *a, int n) {\n", | |
" a->nrows = n;\n", | |
" a->length = n;\n", | |
" a->maxsize = n;\n", | |
" a->offset = 0;\n", | |
"\n", | |
" return;\n", | |
"}\n", | |
"\"\"\"\n", | |
"\n", | |
"const Clib2 = tempname()\n", | |
"open(`gcc -I $header -fPIC -O3 -msse3 -xc -shared -o $(Clib2 * \".\" * Libdl.dlext) -`, \"w\") do f\n", | |
" print(f, C_code2) \n", | |
"end\n", | |
"setarraypar(v, n) = ccall((:jl_set_array, Clib2), Nothing, (Any,Int32,), v, n)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 19, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"50000000-element Array{Int64,1}:\n", | |
" 10\n", | |
" 20\n", | |
" 30\n", | |
" 40\n", | |
" 50\n", | |
" 60\n", | |
" 70\n", | |
" 80\n", | |
" 90\n", | |
" 100\n", | |
" 110\n", | |
" 120\n", | |
" 130\n", | |
" ⋮\n", | |
" 499999890\n", | |
" 499999900\n", | |
" 499999910\n", | |
" 499999920\n", | |
" 499999930\n", | |
" 499999940\n", | |
" 499999950\n", | |
" 499999960\n", | |
" 499999970\n", | |
" 499999980\n", | |
" 499999990\n", | |
" 500000000" | |
] | |
}, | |
"execution_count": 19, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"v = Vector{Int}(undef, 0)\n", | |
"n = 50_000_000\n", | |
"for i in 1:n\n", | |
" push!(v, i*10)\n", | |
"end\n", | |
"v" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"0-element Array{Int64,1}" | |
] | |
}, | |
"execution_count": 20, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"for i in 1:n\n", | |
" pop!(v)\n", | |
"end\n", | |
"v" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"50000000-element Array{Int64,1}:\n", | |
" 10\n", | |
" 20\n", | |
" 30\n", | |
" 40\n", | |
" 50\n", | |
" 60\n", | |
" 70\n", | |
" 80\n", | |
" 90\n", | |
" 100\n", | |
" 110\n", | |
" 120\n", | |
" 130\n", | |
" ⋮\n", | |
" 499999890\n", | |
" 499999900\n", | |
" 499999910\n", | |
" 499999920\n", | |
" 499999930\n", | |
" 499999940\n", | |
" 499999950\n", | |
" 499999960\n", | |
" 499999970\n", | |
" 499999980\n", | |
" 499999990\n", | |
" 500000000" | |
] | |
}, | |
"execution_count": 21, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"setarraypar(v, Int32(n))\n", | |
"v" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Julia 1.1.0", | |
"language": "julia", | |
"name": "julia-1.1" | |
}, | |
"language_info": { | |
"file_extension": ".jl", | |
"mimetype": "application/julia", | |
"name": "julia", | |
"version": "1.1.0" | |
}, | |
"toc": { | |
"base_numbering": 1, | |
"nav_menu": {}, | |
"number_sections": true, | |
"sideBar": true, | |
"skip_h1_title": false, | |
"title_cell": "Table of Contents", | |
"title_sidebar": "Contents", | |
"toc_cell": false, | |
"toc_position": {}, | |
"toc_section_display": true, | |
"toc_window_display": false | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment