jl_stat_ctime

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

jl_stat_ctime

Brandon Taylor
Right now in base jl_stat_ctime looks like this:

JL_DLLEXPORT double jl_stat_ctime(char *statbuf)
{
    uv_stat_t *s;
    s = (uv_stat_t*)statbuf;
    return (double)s->st_ctim.tv_sec + (double)s->st_ctim.tv_nsec * 1e-9;
}

And it's called with

ccall(:jl_stat_ctime,   Float64, (Ptr{UInt8},), buf)

I'd like to simplify this.

I'd like a type

type FineComputerTime
    seconds::Int
    nanoseconds::Int
end

And a way to fill it in using the stat buffer.

Can anyone offer some tips? The c code keeps confusing me.




I
Reply | Threaded
Open this post in threaded view
|

Re: jl_stat_ctime

Jeffrey Sarnoff
Look at the help for tic() and toc().
Do you care about interfacing directly with jl_ routines?  If not, and you are trying to make your own harness ... perhaps this would help:
#=
   Using immutable rather than type with fields that are 
   simple and immediate values keeps information directly
   available (rather than indirectly available, like arrays).

   Use Int64 because nanosecond timing uses 64 bits (UInt64).

   time_ns() "Get the time in nanoseconds. 
              The time corresponding to 0 is undefined,
              and wraps every 5.8 years."

   time_zero because the timer is given as a UInt64 value, and 
            there are more of those than positive Int64s.
=#

const time_zero = [time_ns()]
get_time_zero() = time_zero[1]
function set_time_zero(nanoseconds::UInt64)
    time_zero[1] = nanoseconds
    return nanoseconds
end    

immutable FineComputerTime
    seconds::Int64
    nanoseconds::Int64
end

function FineComputerTime(nanosecs::UInt64)
    nanosecs -= get_time_zero()
    secs, nsecs = fldmod( nanosecs, 1_000_000_000%UInt64 ) # value%UInt64 is a fast way to force the type
    return FineComputerTime( Int64(secs), Int64(nsecs) )
end

FineComputerTime() = FineComputerTime(time_ns())








On Friday, October 28, 2016 at 10:07:42 AM UTC-4, Brandon Taylor wrote:
Right now in base jl_stat_ctime looks like this:

JL_DLLEXPORT double jl_stat_ctime(char *statbuf)
{
    uv_stat_t *s;
    s = (uv_stat_t*)statbuf;
    return (double)s->st_ctim.tv_sec + (double)s->st_ctim.tv_nsec * 1e-9;
}

And it's called with

ccall(:jl_stat_ctime,   Float64, (Ptr{UInt8},), buf)

I'd like to simplify this.

I'd like a type

type FineComputerTime
    seconds::Int
    nanoseconds::Int
end

And a way to fill it in using the stat buffer.

Can anyone offer some tips? The c code keeps confusing me.




I
Reply | Threaded
Open this post in threaded view
|

Re: jl_stat_ctime

Jeffrey Sarnoff
If you are working with file information, use e.g. `file_stats=stat(); file_creation_time = file_stats.ctime; file_modification_time = file_stat.mtime;` 
You will get Float64 values, to make FineComputerTimes from those, 

function FineComputerTime(stat_time::Float64)
   nanosecs
= round(UInt64, stat_time * 1.0e9)
   
return FineComputerTime(nanosecs)
end




On Tuesday, November 1, 2016 at 3:44:07 PM UTC-4, Jeffrey Sarnoff wrote:
Look at the help for tic() and toc().
Do you care about interfacing directly with jl_ routines?  If not, and you are trying to make your own harness ... perhaps this would help:
#=
   Using immutable rather than type with fields that are 
   simple and immediate values keeps information directly
   available (rather than indirectly available, like arrays).

   Use Int64 because nanosecond timing uses 64 bits (UInt64).

   time_ns() "Get the time in nanoseconds. 
              The time corresponding to 0 is undefined,
              and wraps every 5.8 years."

   time_zero because the timer is given as a UInt64 value, and 
            there are more of those than positive Int64s.
=#

const time_zero = [time_ns()]
get_time_zero() = time_zero[1]
function set_time_zero(nanoseconds::UInt64)
    time_zero[1] = nanoseconds
    return nanoseconds
end    

immutable FineComputerTime
    seconds::Int64
    nanoseconds::Int64
end

function FineComputerTime(nanosecs::UInt64)
    nanosecs -= get_time_zero()
    secs, nsecs = fldmod( nanosecs, 1_000_000_000%UInt64 ) # value%UInt64 is a fast way to force the type
    return FineComputerTime( Int64(secs), Int64(nsecs) )
end

FineComputerTime() = FineComputerTime(time_ns())








On Friday, October 28, 2016 at 10:07:42 AM UTC-4, Brandon Taylor wrote:
Right now in base jl_stat_ctime looks like this:

JL_DLLEXPORT double jl_stat_ctime(char *statbuf)
{
    uv_stat_t *s;
    s = (uv_stat_t*)statbuf;
    return (double)s->st_ctim.tv_sec + (double)s->st_ctim.tv_nsec * 1e-9;
}

And it's called with

ccall(:jl_stat_ctime,   Float64, (Ptr{UInt8},), buf)

I'd like to simplify this.

I'd like a type

type FineComputerTime
    seconds::Int
    nanoseconds::Int
end

And a way to fill it in using the stat buffer.

Can anyone offer some tips? The c code keeps confusing me.




I