Merhaba,
String ifadenin bellekte ne kadar alan kapladığını nasıl anlarım ?
Dil önemli değil , bellek için soruyorum.
Teşekkürler.
Merhaba,
String ifadenin bellekte ne kadar alan kapladığını nasıl anlarım ?
Dil önemli değil , bellek için soruyorum.
Teşekkürler.
Yapay zekaya sordum. Diyor ki dile göre değişir. Mesela C ve C++’da string ‘ler char dizisi olarak tutuluyor. Eğer karakter kodlaması olarak ASCII kullanıyorsan her bir karakter 1byte yer kaplar diyor. Dolayısıyla string ifadende kaç karakter varsa o kadar byte yer kaplayacak. Eğer utf-8 kodlaması kullanıyorsan her bir karakter için yine 1byte, utf-16 ise 2byte yer kullanılacak.
Java ve Python ‘da string ‘ler char dizisi olarak değil, nesne olarak saklanıyor. Bu nedenle bellekte daha fazla yer kaplıyor. Nesnenin bellekte başlığı, referans bilgisi, taşıdığı veri derken bayağı bir yer kaplayabiliyor.
ChatGPT den bir karşılaştırma istedim. “Merhaba” string inin 7 karakter olmasına rağmen C gibi dillerde 8byte yer kaplamasının nedeni, bu dillerde her stringin sonunda null karakterinin olması ve 1byte da bu null karakterinin yer kaplamasıymış.
Bir string’in bellekte ne kadar yer kapladığı kullanılan programlama diline bağlıdır. C gibi diller string’i 8 baytlık bir dizi halinde tutar, string’in uzunluğunu tutmaz. Python gibi diller string nesnesinin içinde uzunluğu da tutar. Ayrıca string’in ASCII mi yoksa Unicode mu olup olmadığına göre bir karakterin tuttuğu alan da değişir.
String dediğimiz aslında karakterlerin ard arda gelmiş halidir. Karakterler de aslında birer sayıdır. Mesela ASCII kodlamasında bir karakter 8 bayttır. Unicode’da daha büyük ve değişkendir.
Eğer stringlerin bellekte tuttuğu alanı anlamak istiyorsanız öncelikle ASCII ve Unicode’u araştırmanızı tavsiye ederim.
Teşekkürler, kodlayacağım.
Olcerek veya arastirarak.
“Once” ve “sonra” olarak belirlediginiz iki noktada programi durdurup muhtelif olcum aletleriyle, veya dogrudan koda eklenmis “kullanilan bellegi dondur” fonksiyonlariyla yapabilirsiniz. Veya, programi string ifadeli ve ifadesiz olarak calistirip ayni sekillerde farki bulabilirsiniz.
Istediginiz dilde, mimaride, programda string’lerin nasil tutuldugunu arastirarak. Ornegin “Merhaba” string’i:
C’de ‘M’, ‘e’, ‘r’, ‘h’, ‘a’, ‘b’, ‘a’, ‘\0’ karakterleri ile ifade ediliyor. (8 byte) Ona isaret eden pointer’i da katmak isterseniz sizeof(char*) = muhtemelen 8 veya 4 byte ekleniyor
C++’da std::string de ayni karakterleri kullaniyor, fakat kapasite ve uzunluk degerleri de var. Gecen hafta reverse engineer ettigim kod std::string ise ve dogru hatirliyorsam MSVC, x86’da 24 byte tutuyor. 16 byte ufak string veya pointer alani + 4 byte uzunluk + 4 byte kapasite. Buna pointer’i sayiyorsak, bir 4 byte daha.
Java ve C# string’leri UTF-16 olarak tutuyor, yani karakter basina en az 2 byte. Yine muhtelif overhead’leri var.
Neyi, ne icin olcmek istiyorsunuz? Cevap cok degisiyor cunku.
Mesela kullanilmayan bir string ifadesi, hic yer tutmayabilir. Sadece hic cagrilmayan bir fonksiyonda kullanilan bir ifade de.
Degisken olmayan bir ifade, calistirilabilir bir dosyanin salt-okunur data kisminda durarak sadece karakterleri kadar yer kaplayabilir. Bu yer, en yakin 4096 byte’a yuvarlandigi icin pratikte hic yer kaplamayabilir. Kullanildigi noktada dinamik olarak yaratilan sinifin overhead’i eklenebilir.
Degisken bir ifade, kullanici veya baska bir yerden gelen girdiye gore herhangi bir boyutta yer kaplayabilir. Mesela C#’taki $”{foo}” veya JS’deki `${foo}` string ifadesi, kullanildiklari andaki foo degiskeninin degerine gore degisen degerler alabilir, degisik miktarlarda bellek kullanabilir.
Yapay zekaya herkesin erisimi var. Soruyu soran, veya burada cevaplamaya calisan insanlarin yapamayacagi veya yapmadigi ne yaptiniz, uzerine ne kattiniz?
Tam olarak ne sordunuz ve ne cevap aldiniz? Hangi yapay zeka modelini, nasil ayarlarla calistirdiniz?
Arkadaşlar öncelikle çok Teşekkürler.
Benim amacım sadece kaç byte olduğunu ölçmek değil. Yönettiğim işletim sistemlerini daha verimli kodlamak. Yani bir Debian sunucum varsa bu sunucunun masraflarını daha iyi görmek istiyorum.
Masraftan kastettiğim ne kadar elektrik tüketeceği, kaç GB RAM harcayacağı vs
Teşekkürler
Hocam ne demek istediğinizi anladım. Bundan sonra hangi aracı hangi promptlarla kullandığıma dair daha ayrıntılı yazarım. Direkt olarak yapay zekanın cevabını yapıştırmak yerine özetleyip yazayım dedim. Uzun metin yapıştırmak çirkin görünebilir diye düşündüm.
Herkesin erişimine açık olduğunu elbetteki biliyorum lakin konuyu açan arkadaş belki oradan bakmamış olabilir diye düşündüm.
Kendi bilgim kısıtlı, araştırıp üzerine ekleyip yazabilirdim fakat hızlı bir dil karşılaştırma tablosu koyabilmek adına AI’ye sormak cazip geldi.
Saygılar
Daha once duymadiysaniz, sunu okuyun ve bir yerlere altin harflerle kaziyin: Optimizasyonun ilk adimi, olcumdur.
Yani string’lere veya baska herhangi bir seye dalmadan once, oncelikle soz konusu sistemde nelerin elektrik tukettigini, RAM harcadigini bulmaniz gerek. Mesela Chrome erisebildigi her bilgiyi reklam firmalarina hediye edebilmek icin sayfa basina 200 tane request yapiyorsa, LibreOffice’in string’leri nasil tuttugunun pek bir onemi yok.
Cogunlukla, algoritmik optimizasyonun numerik optimizasyonu katlayarak gectigini de hatirlatalim. Bir hashtable yardimiyla tek adimda bulunabilecek seyi aramak icin N tane karsilastirma yapiliyorsa, bu karsilastirmalarin ne kadar hilzli oldugu da onemli degil.
Bunun disinda, amaciniz yazdiginiz kodu veya yonettiginiz isletim sistemini daha iyi tanimaksa, sunlari tavsiye ederim:
Eyvallah. Bence her AI kullanimini sorguladiktan sonra, yukarida yazdigim gibi seyleri akilda tuttuktan sonra (“herkesin chatgpt’nin bedava versiyonuna erisimi var”) AI kullaniminda bir sorun yok.
Ama mesela soyledigim her seyi AI’a sorup cevabini yapistiran bir insan var (burada degil). Varliginin amacini sorguluyorum.
Sorun su, LLM’lerin yayginlasmasi, ortalama cevap vermeyi cok ucuzlastirdi. Buraya soran ve cevap verdigim insanlarin, ortalamanin ustunde cevap aradiklarini varsayiyorum. (Yoksa ya AI’a sorarlar, ya da ben cevap vermem) Tam olarak bu yuzden AI ciktisi, tanim geregi ortalama bir cevap verirken iki kere dusunmek lazim.
Araya girerek bir sey katiyorsaniz, veya en kotu ihtimal kendiniz bir seyler ogreniyorsaniz, bu iyi bir sey. Ciktinin yapay zeka tarafindan uretildigini de belirttiginiz surece (bu, okuyanin zamanina saygi gostermek icin; cunku artik okumak yazmaktan daha zor) sorun yok.
Kisacasi yaptiginiza karsi degilim, uzerinde dusunmek/dusundurtmek/diyalog kurmak istedim ![]()
Teşekkürler, assembly çalışmaya devam edeceğim
Merhabalar,
Ben de sistem optimize etmeye çalışıyorum. @aib hocamın dediğine ben de şunu eklemek istiyorum. performans ölçmek için (perf) tool larını kullanabilirsiniz. Önce htop, glances, top gibi toolları kullanarak CPU kullanımlarını gözlemlersiniz. Sonrasında ilgili process için FlameGraph toolunu kullanarak bir process’te hangi fonksiyonun CPU’nun yüzde kaçını tükettiğini gözlemleyebilirsiniz. Bunun için bir script yazmıştım. Tabi siz yine de araştırın dediklerimi.
BENCHMARKS_DIR=~/benchmarks
timestamp=$(date +"%y-%m-%d-%H-%M")
mkdir -p ${BENCHMARKS_DIR}/${timestamp}
cd ${BENCHMARKS_DIR}/${timestamp}
echo '-1' | sudo tee /proc/sys/kernel/perf_event_paranoid
planner_pid=$(pgrep -f planner_server)
perf record -F 99 -p ${planner_pid} -g -- sleep 60
perf script > planner.perf
~/FlameGraph/stackcollapse-perf.pl planner.perf > planner.folded
# behavior_server_pid=$(pgrep -f behavior_server)
# perf record -F 99 -p ${behavior_server_pid} -g -- sleep 60
# perf script > behavior_server.perf
# ~/FlameGraph/stackcollapse-perf.pl behavior_server.perf > behavior_server.folded
Sonrasında ilgili klasöre gidip flamegraph’ı görüntüleyebilirsiniz. Tabi svg dosyasını bilgisayarda açmayı unutmayın. Aşağıdaki komut sadece svg dosyası oluşturur.
./flamegraph.pl planner.folded > planner_server.svg
Teşekkürler htop kullanıyordum. Diğerlerine de bakacağım.
Aa iyi dedin bak, ben de time ekleyeyim.
15:17:58 0 aib@vivaldi:/tmp% /usr/bin/time python -c 'for i in range(128): print(f"i={i}")' > /dev/null
0.00user 0.00system 0:00.01elapsed 92%CPU (0avgtext+0avgdata 10240maxresident)k
0inputs+0outputs (0major+1126minor)pagefaults 0swaps
veya:
15:18:00 0 aib@vivaldi:/tmp% /usr/bin/time -v -- python -c 'for i in range(128): print(f"i={i}")' > /dev/null
Command being timed: "python -c for i in range(128): print(f"i={i}")"
User time (seconds): 0.01
System time (seconds): 0.00
Percent of CPU this job got: 93%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.01
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 10368
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 1125
Voluntary context switches: 1
Involuntary context switches: 0
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
İlk sorudan ikinci açıklamanızı anlamadım.
Ölçüm araçlarını tavsiye etmişlerdir.
Olaya farklı bir bakış açısı getirelim;
Sorunu kaynağında çözmeye yönelik bir yaklaşımı bellekte yapabilirsiniz.
Surviving The RAM Price Squeeze With Linux In-Kernel Memory Compression | Hackaday
Makaleye bakarak verimli ram kullanımı açısından da kernel i düzenlemek ve derlemek isteyebilirsiniz. Ölçme ardından, bellek sıkıştırma ile ekonomi durumunu değerlendirebilirsiniz belki.
Teşekkürler okuyacağım makalenizi