Merhaba, Bilgisayarımın kaynaklarını (cpu, ram, hard disk) kullanacak, anlamlı olması gerekmeyen, belirlenmiş sürede çalışacak bir java programı hazırlamam lazım. Diğer bir deyişle istenen sürede, belirlenen parametrelere göre makinemin ram, cpu diskini kullanacak.

Ram kullanımı için dizi oluşturdum. Bir int karekteri için 32bit, bir long için 64 bit gerekiyormuş. Kullanıcının gireceği değere göre (10, 100, 1000 gibi) ram kullanımı belirlenecek. Ör: kullanıcı parametre olarak 1000 (yaklaşık 1gb için) 262milyon karekter lazım geliyor. Long [] long_dizi = new Long[length256*1024] // length parametre olarak verilecek

Disk kullanımı için bir text dosyası oluşturdum. For döngüsüyle birşeyler yazdırıyor ve "int filesize = (int)file.length();" "filesizeInMB = filesize/1024/1024;" ile dosya boyutunu alıyor ve while(filesizeInMB < size) için ("size" mb cinsinden dosya boyutu) yazdırıyor. bu şekilde dosya boyutu kontrolü yapılacak ve belirlenen paratmetreye (size) geldiğinde yazma işlemi bitecek.

Süre kontrolünü de aynı şekilde metodoun başında "long start = System.currentTimeMillis();" ile başlangıç zamanını alarak, "end = System.currentTimeMillis();" ile sürekli kontrol yapılıyor ve start-end farkı istenen değere gelince çalışma sonlanıyor.

Bunlar yapabildiklerim ve şu an için problemsiz çalışıyor. dosya boyutunda şöyle bir durum var çalışma süresi çok kısa olduğunda istenilen büyüklükte bir txt dosyası üretilemeyebiliyor. Ancak hem programın çalışma süresi çok kısa olmayacak (5-10 sn gibi) hem de oluşturulacak txt dosyası çok büyük olmayacağı için (ortalama 100 mb olabilir) çok olumsuz bir durum değil.

Bütün bunlar yapılırken program normal olarak cpu harcıyor. Programın harcadığı cpu'yu nasıl kontrol edebilirim ?

Aslında bütün bunların çok hassas olması gerekmiyor ancak en azından sınırlandırılabilir halde olması tercihim. Yukarıda saydıklarım yapılırken misal olarak %15 cpu harcıyorsam bunu %50'ye çıkarmam için neler yapabilirim ? karmaşık hesaplar (log alma, üstel işlemler çarpma bölme vs) yapsam nasıl olur ?

bu işlere yeni başlamış biri olarak bu konudaki tavsiyeleriniz duymak isterim. Teşekkür ederim

soruldu: 04 Mar '12, 12:27

aheng's gravatar image

aheng
2067815
cevap kabul oranı: 7%


döngü içinde yeni threadler yaratıp çalıştırarak bunu sağlayabilirsin.

bu da örnek kodu:

while(true){
    Thread thread = new Thread();
    thread.start();
    }
permanent link

cevaplandı: 04 Mar '12, 13:03

goksel's gravatar image

goksel
82071728
cevap kabul oranı: 8%

peki birden fazla thread tanımlamam halinde de aynı artırım söz onusu olabilir mi ? mesela verdiğiniz kodla kendi makinem için %20 gibi bir cpu kullnımı artışı oldu. bu kullanımı ayarlanabilir halee getirmek için mesela %60a %80e çıkarmak için nasıl bir yol izleyebilirim ? yeni thread nesnleri tanımlayarak yapıtığımda bir artış göremedim de..

(06 Mar '12, 06:14) aheng aheng's gravatar image

ben daha önce windows ortamında bir sonsuz döngü içersinde sürekli kanal açmayı denemiştim sistem kilitlendi ve reset atmak zorunda kaldım ama alternatif olarak ;

package cpu_stress;

import java.util.Random;

public class Stress  implements  Runnable{
private static long temp;
private static int i;

    public Stress() {

        for (; i < 100; ) {
            new Thread(this).start();
            i++;
        }
    }

    public static void main(String[] args) {

new Stress();

    }

    public void run() {
        while((new Random().nextLong() % 2 ==0) ? Stress(): Stress()){
        temp+=1.35465145;

        }

    }

    public boolean Stress(){
             temp-=1.35465145;
             return  true;
    }
}

bu kodu ubuntu da çalıstırdığımda her 2 çekirdeğide %100 kullanıyor,"windows' ta denemedim" kanal sayısı arttılılabilir..

permanent link

cevaplandı: 04 Mar '12, 13:57

trueLife's gravatar image

trueLife
699182430
cevap kabul oranı: 10%

win7 de de bu haliyle çalıyor. %100 kullanım söz konusu. daha iy kavrayabilmem ve yorum yapabilmem kodu birazcık açıklar mısın ? Bir de kullanması gereken cpu yüzdesi için nasıl parametre verebilirim ? örnek parametre olarak 20 girilecek %20 cpu harcanak 80 için %80 harcanak. teşekkür ederim

(06 Mar '12, 06:32) aheng aheng's gravatar image

burada stress isimli sınıfa kanal özelliği kazandırabilmek için (implements runnable) terimleri kullanıyoruz bu asamadan sonra her stress nesnesi kendi basına calısacak olan kanallara yapıcıda parmetre olarak verilebilecektir.main metodu içersinde bir stress nesnesi yaratıyoruz bu; yapıcı içrsnde 100 adet kanalın olusturulup calısmasına yol acıyor (burada önemli bi nokta var 100 kanalda da aynı stress nesnesini referans gösteriyoruz(this) ile) bu 100 kanalın da aynı run metodunu çalstrmasına yol acıyor yani her bir kanal için bi stress instance'ı olusturmaktansa aynı stresi 100 ünede vryrz.

(06 Mar '12, 14:53) trueLife trueLife's gravatar image

bu sekilde davranmanın extra bi işlemci yükü olurmu bilmiyorum ama ram dan kar ediyoruz ben javada cpu ya %10 unu kullansın gibi bi ayar warmı bilmiyorum heralde yoktur c-c++ ta bu gibi programlar denerken de bizim aklımıza gelmişti nasıl belli bi kısmını calistırabiliriz diye ama çözüm bulamadık sadece programsal olarak söyle bi önerim olabilir işlemci bilgisini (calışma frekansı )alıp formdan alınan yüzde ile oranlayıp kanalsayıları ona göre belirlenebilir bi kaç deneme yapmak gerek hangi degerlerle ne kadar kullnıyor diye

(06 Mar '12, 15:01) trueLife trueLife's gravatar image

son bir not kanal lar ile calısırken hiç beklenmedik sorunlar cıkarsa nesne referanslarına dikkat etmelisin olmaması gereken yerde bir çok kanal aynı nesneyi kullanıyor olabilir.ayrıca dahada yük olması için bence kanalın yaptığı iş az kanal sayısı cok olmalıdır bu sayede bağlam değişimlerinde işlemciyi daha cok yoran bizim kodlarımızın denk gelme ihtimali artabilir

(06 Mar '12, 15:01) trueLife trueLife's gravatar image
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×1,079
×7
×2

Soruldu: 04 Mar '12, 12:27

Görüntüleme: 1,181 kez

Son güncelleme: 02 Nis, 19:10

powered by BitNami OSQA