C_and_CPP 板


LINE

开发平台(Platform): (Ex: Win10, Linux, ...) Linux 编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出) GCC 问题(Question): 我写了一个以暴力演算法求最佳解的程式, 主要是透过不断更新所找到的更好的解来达成。 但是我希望能设定一个时间上限, 如果程式还没跑完就直接输出目前找到的最好的解。 请问有办法在 C 里面实作这个功能吗? --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.112.249.201
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1514603097.A.868.html
1F:→ loveflames: SIGALRM 12/30 11:19
2F:推 Hazukashiine: POSIX Thread 或是 Signal Handler 12/30 14:32
3F:→ Hazukashiine: 像是可以 SIGINT 时印出 ex. ping 12/30 14:34
4F:推 edisonhello: clock <ctime> 可以用 12/30 15:38
5F:推 alan23273850: 透过signal是还不错的方法,不过如果不想碰系统底层 12/30 16:04
6F:→ alan23273850: 的话其实我有另一个创意方法,你可以设一个全域变数 12/30 16:04
7F:→ alan23273850: 纪录程式一开始的时间戳,之後在code会重复执行的地 12/30 16:05
8F:→ alan23273850: 方插入查询当下时间戳的code,跟最一开始的全域变数 12/30 16:06
9F:→ alan23273850: 相减,超过一定的值就代表跑太久,跳出回圈即可 12/30 16:06
10F:→ alan23273850: 这样副作用是会降低程式效率,112我觉得可以弄signa 12/30 16:07
11F:推 b0920075: 用signal算满简单的吧XDDD跟112有什麽关系 12/30 18:26
12F:推 longlongint: 直接看回圈计数值最简单 12/30 18:45
13F:→ Lipraxde: 设个条件求到够好的解就跳出也不错啊 12/30 19:42
感谢各位的回覆 研究了一下signal似乎是要^C才能发挥作用 但我希望的是程式自动在指定的时间一到後就印出最佳解 回圈计数值是一个简单可行的方法 不过我的程式在每次回圈的过程中所经过的时间会不太一样 而最佳解的值比较难预估 无法使用设条件的方法 纪录时间戳的方法可能比较接近限制时间上限的原旨 不过的确也会造成每次检查降低程式效率 ※ 编辑: BreathWay (140.112.249.201), 12/30/2017 22:21:21
14F:→ Hazukashiine: 事实上你可以搭配 Linux 的 cron (job scheduler) 12/30 22:35
15F:→ Hazukashiine: 来达成定时发送 SIGINT 的任务 不一定要人亲自去按 12/30 22:35
16F:→ galic: Ctrl+C只是其中一种Signal(SIGINT)好吗 然後推文为何一直叫 12/30 23:01
17F:→ galic: 人家用SIGINT 明明就有timer用的signal 12/30 23:01
18F:→ galic: 你也只有polling counter或是透过timer两种作法 12/30 23:03
19F:→ galic: 但照po後来的回覆 这种需求就是要走timer阿 12/30 23:06
20F:→ galic: 那就看一看timer的文件 https://tinyurl.com/lo9e3w3 12/30 23:08
21F:→ galic: https://tinyurl.com/d5fw2rh 12/30 23:09
22F:→ Hazukashiine: 用 SIGINT 是因为方便 弹性比较高 可以搭配脚本使用 12/30 23:40
23F:→ Hazukashiine: 如果程式正在前景跑 但是手痒想在 timer expired 12/30 23:40
24F:→ Hazukashiine: 前看偷看 按一下 ctrl + c 就可以了 如果想要静静放 12/30 23:40
25F:→ Hazukashiine: 後景跑 就指令後面加 & 如果直接用楼上的方法写死在 12/30 23:40
26F:→ Hazukashiine: 程式里编译好的话 就没有这种好处了 更何况楼主可能 12/30 23:40
27F:→ Hazukashiine: 只是想偶尔偷看一下进度而已 我觉得用 SIGINT 合适 12/30 23:40
28F:→ galic: 不用帮别人脑补 12/30 23:49
29F:→ Schottky: 要闹钟给一支市话的概念,也是能用但好像哪里不太对 12/31 05:22
30F:→ Killercat: 用chrono拿start time, 在loop里面每做完一次运算就 12/31 08:17
31F:→ Killercat: 再拿一次timer, 去相减看看到threshold没 12/31 08:17
32F:→ Killercat: 如果你对时间的精度要求不是特别高的话,这最简单 12/31 08:18
33F:→ Killercat: 外部用OS SDK/Signal去砍比较准 但是要依赖外部 12/31 08:19
34F:→ Killercat: 这前提是假设你的演算是不可中断的 12/31 08:20
35F:→ Killercat: 但是你说brute force, 单次演算应该都不会太长才是 12/31 08:20
36F:→ alan23273850: 顺带提醒一下,最好测一下持续查询时间戳这个动作对 12/31 08:47
37F:→ alan23273850: 效能的影响,这个有时候会超乎你想像,牵涉到system 12/31 08:47
38F:→ alan23273850: call的函式都要注意,通常时间比例是关键 12/31 08:48
39F:→ GaliTW: Linux有vDSO 不用担心 12/31 09:04
40F:推 steve1012: 感觉原 po只是要一个简单的方法可以停止而已xD 应该不 12/31 10:21
41F:→ steve1012: 用太精细? 12/31 10:21
42F:→ steve1012: 你也可以output 每 k个 iteration 後的解就好 12/31 10:22
43F:→ steve1012: 这样你想停就直接ctrl c 12/31 10:22
44F:→ Killercat: alan倒是说到重点,要是每次运算都只有10几个clock 12/31 10:43
45F:→ Killercat: 那真的会造成很巨大的影响(这是绝对有可能的) 12/31 10:43
46F:推 steve1012: 可以每 k次 check 就好 12/31 10:43
47F:→ Killercat: 不过普通情况下 profiling一下 应该没问题就取简单的吧 12/31 10:44
48F:推 jasonwu23: 他要时间到印解答呀 你ctrl c程式跳出来了还能印吗 12/31 17:23
49F:→ Hazukashiine: 可以 ctrl+c (SIGINT) 印出 ctrl+\ (SIGQUIT) 结束 12/31 17:26
50F:→ Hazukashiine: 这些 signals 都是可以重载的 >< 12/31 17:27
51F:→ Killercat: 不过牵扯到kernel space的呼叫的话 记得sigint handler 12/31 23:11
52F:→ Killercat: 要做收尾动作,不然kernel state可能会出包 12/31 23:11
53F:→ Killercat: 比方说用ioctl设旗标等等动作都要小心点 12/31 23:12
54F:→ y3k: 用过SIGINT+1 XD 01/01 11:23
55F:推 alan23273850: 上面steve大大也有提到一点,如果每次iter时间差不 01/01 14:39
56F:→ alan23273850: 多的话,也可以用迭代次数取代时间,以省去系统呼叫 01/01 14:39
57F:→ sunneo: 照其他语言的习惯是设cancellation token,并让你的演算法 01/01 17:58
58F:→ sunneo: 改写成iterator,每个iteration都看时间。 01/01 18:00
59F:→ x000032001: 想要不影响效能吗 写个thread处理吧 (X 01/01 20:41
60F:→ joe820730: 是我的话会考虑写个thread计时...什麽signal都不用处理 01/01 21:46
61F:→ bben900911: 笨笨如我也会这样。 把最新结果放在全域或heap,另一 01/02 11:04
62F:→ bben900911: 个thread固定wait自己,起来後就去取值@@ 01/02 11:04
63F:→ Lipraxde: 这样的话要注意互斥的问题呢 01/02 13:09
64F:→ jimfan: 赞同用signal最精简 01/03 09:59







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP