• [^] # Re: Les techniques de génie logiciel

    Posté par . En réponse à la dépêche Miguel de Icaza s'explique sur .NET. Évalué à -4.

    Je vois pas ce que a de plus compliqué

    Fait un sondage autour de toi... Pour ceux qui lisent, est-ce que vous trouvez ça plus compliqué ou pas ?

    Au passage, je te signale qu'avec ton code on est obligé de penser à effacer chaque complex crée, y compris le résultat de complex_mul. Et d'ailleurs, tu te fais chier pour rien avec des malloc(), dans le cas d'une struct comme celle-là tu peux rester en semantique par valeur.

    Pour l'exemple sur les chaines, je te laisse également voir autour de toi si c'est "aussi simple". Et note que rien qu'avec une operation aussi triviale, tu es obligé de faire de la gestion mémoire (liberer le resultat).

    J'attends toujours la State Pattern.
    Tiens, sinon y a ça aussi :

    module Profiler__
    Start = Float(Time.times[0])
    top = "toplevel".intern
    Stack = [[0, 0, top]]
    MAP = {"#toplevel" => [1, 0, 0, "#toplevel"]}

    p = proc{|event, file, line, id, binding, klass|
    case event
    when "call", "c-call"
    now = Float(Time.times[0])
    Stack.push [now, 0.0, id]
    when "return", "c-return"
    now = Float(Time.times[0])
    tick = Stack.pop
    name = klass.to_s
    if name.nil? then name = '' end
    if klass.kind_of? Class
    name += "#"
    else
    name += "."
    end
    name += id.id2name
    data = MAP[name]
    unless data
    data = [0.0, 0.0, 0.0, name]
    MAP[name] = data
    end
    data[0] += 1
    cost = now - tick[0]
    data[1] += cost
    data[2] += cost - tick[1]
    Stack[-1][1] += cost
    end
    }
    END {
    set_trace_func nil
    total = Float(Time.times[0]) - Start
    if total == 0 then total = 0.01 end
    MAP["#toplevel"][1] = total
    # f = open("./rmon.out", "w")
    f = STDERR
    data = MAP.values.sort!{|a,b| b[2] <=> a[2]}
    sum = 0
    f.printf " %% cumulative self self total\n"
    f.printf " time seconds seconds calls ms/call ms/call name\n"
    for d in data
    sum += d[2]
    f.printf "%6.2f %8.2f %8.2f %8d ", d[2]/total*100, sum, d[2], d[0]
    f.printf "%8.2f %8.2f %s\n", d[2]*1000/d[0], d[1]*1000/d[0], d[3]
    end
    f.close
    }
    set_trace_func p
    end


    C'est le profiler standard de Ruby. L'équivalent de gprof, en 55 lignes a peine. C'est pas bien indenté, mais tu dois l'avoir sur ton linux (locate profile.rb).